GCC Code Coverage Report


Directory: ./
File: commands/EventCommands.cpp
Date: 2026-10-29 08:11:58
Exec Total Coverage
Lines: 265 295 89.8%
Functions: 35 35 100.0%
Branches: 447 892 50.1%

Line Branch Exec Source
1 /*
2 * This file is part of the Falcon Player (FPP) and is Copyright (C)
3 * 2013-2022 by the Falcon Player Developers.
4 *
5 * The Falcon Player (FPP) is free software, and is covered under
6 * multiple Open Source licenses. Please see the included 'LICENSES'
7 * file for descriptions of what files are covered by each license.
8 *
9 * This source file is covered under the LGPL v2.1 as described in the
10 * included LICENSE.LGPL file.
11 */
12
13 #include "fpp-pch.h"
14
15 #include "fpp-json.h"
16
17 #include <cmath>
18 #include <functional>
19
20 #include "../Sequence.h"
21 #include "../Timers.h"
22 #include "../common.h"
23 #include "../effects.h"
24 #include "../log.h"
25 #include "../overlays/PixelOverlay.h"
26 #include "../overlays/PixelOverlayModel.h"
27 #include "../scripts.h"
28 #include "../settings.h"
29
30 #include "EventCommands.h"
31
32 // A slot is a whole number 1..255 ("3.0" and spaces round it are fine);
33 // anything else is 0, which is what a preset with no slot holds.
34 19 static int ParsePresetSlot(const std::string& s) {
35 19 char* end = nullptr;
36 19 double v = strtod(s.c_str(), &end);
37
3/4
✓ Branch 0 taken 20 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 19 times.
20 while (end && isspace((unsigned char)*end)) {
38 1 end++;
39 }
40
12/12
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 15 times.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 14 times.
✓ Branch 5 taken 1 times.
✓ Branch 6 taken 12 times.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 1 times.
✓ Branch 9 taken 11 times.
✓ Branch 10 taken 8 times.
✓ Branch 11 taken 11 times.
19 if (end == s.c_str() || *end != '\0' || v != floor(v) || v < 1 || v > 255) {
41 8 return 0;
42 }
43 11 return (int)v;
44 }
45
46 1888 TriggerPresetCommand::TriggerPresetCommand() :
47
2/4
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
3776 Command("Trigger Command Preset") {
48
7/14
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1888 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1888 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1888 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1888 times.
✗ Branch 13 not taken.
15104 args.push_back(CommandArg("name", "datalist", "Preset Name").setContentListUrl("api/commandPresets?names=true"));
49 1888 }
50
51 24 std::unique_ptr<Command::Result> TriggerPresetCommand::run(const std::vector<std::string>& args) {
52
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 24 times.
24 if (args.size() != 1) {
53 ✗ return std::make_unique<Command::ErrorResult>("Not found");
54 }
55
4/6
✓ Branch 0 taken 24 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 24 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 22 times.
✓ Branch 5 taken 2 times.
24 if (CommandManager::INSTANCE.TriggerPreset(args[0]))
56 22 return std::make_unique<Command::Result>("Preset Triggered");
57 else
58
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 return std::make_unique<Command::ErrorResult>("Not found");
59 }
60
61 1888 TriggerPresetInFutureCommand::TriggerPresetInFutureCommand() :
62
2/4
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
3776 Command("Trigger Command Preset In Future") {
63
5/10
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1888 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1888 times.
✗ Branch 9 not taken.
11328 args.push_back(CommandArg("id", "string", "Identifier"));
64
5/10
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1888 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1888 times.
✗ Branch 9 not taken.
11328 args.push_back(CommandArg("ms", "int", "MS In Future").setRange(0, 86400000));
65
7/14
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1888 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1888 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1888 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1888 times.
✗ Branch 13 not taken.
15104 args.push_back(CommandArg("name", "datalist", "Preset Name").setContentListUrl("api/commandPresets?names=true"));
66 1888 }
67 115 std::unique_ptr<Command::Result> TriggerPresetInFutureCommand::run(const std::vector<std::string>& args) {
68
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 115 times.
115 if (args.size() != 3) {
69 ✗ return std::make_unique<Command::ErrorResult>("Not found");
70 }
71 115 long long t = GetTimeMS();
72 115 int val = std::atoi(args[1].c_str());
73 115 long long tv = t + val;
74 115 LogDebug(VB_COMMAND, "\"Trigger Command Preset In Future\" identifier \"%s\" scheduling preset \"%s\" to trigger in %dms\n",
75 args[0].c_str(), args[2].c_str(), val);
76 // The identifier lets a later trigger with the same one replace a pending
77 // timer. Kept in its own namespace: Timers ids are shared with fppd's own
78 // timers, and a user id of "FileMonitor" or "SequencePresets" replaced
79 // that timer's work with the preset.
80
2/4
✓ Branch 0 taken 115 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 115 times.
✗ Branch 3 not taken.
115 Timers::INSTANCE.addTimer("preset:" + args[0], tv, args[2]);
81 115 return std::make_unique<Command::Result>("Timer Started");
82 }
83
84 1888 TriggerPresetSlotCommand::TriggerPresetSlotCommand() :
85
2/4
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
3776 Command("Trigger Command Preset Slot") {
86
5/10
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1888 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1888 times.
✗ Branch 9 not taken.
11328 args.push_back(CommandArg("slot", "int", "Preset Slot").setRange(1, 255));
87 1888 }
88 13 std::unique_ptr<Command::Result> TriggerPresetSlotCommand::run(const std::vector<std::string>& args) {
89
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
13 if (args.size() != 1) {
90 ✗ return std::make_unique<Command::ErrorResult>("Not found");
91 }
92 13 int val = ParsePresetSlot(args[0]);
93
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 7 times.
13 if (val == 0) {
94
3/6
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
6 return std::make_unique<Command::ErrorResult>("Invalid preset slot \"" + args[0] + "\"");
95 }
96
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 1 times.
7 if (CommandManager::INSTANCE.TriggerPreset(val))
97 6 return std::make_unique<Command::Result>("Preset Triggered");
98
2/4
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 return std::make_unique<Command::Result>("No preset in slot " + std::to_string(val));
99 }
100
101 1888 TriggerMultiplePresetSlotsCommand::TriggerMultiplePresetSlotsCommand() :
102
2/4
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
3776 Command("Trigger Multiple Command Preset Slots") {
103
5/10
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1888 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1888 times.
✗ Branch 9 not taken.
11328 args.push_back(CommandArg("SlotA", "int", "Preset Slot A").setRange(1, 255));
104
5/10
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1888 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1888 times.
✗ Branch 9 not taken.
11328 args.push_back(CommandArg("SlotB", "int", "Preset Slot B").setRange(1, 255));
105
5/10
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1888 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1888 times.
✗ Branch 9 not taken.
11328 args.push_back(CommandArg("SlotC", "int", "Preset Slot C").setRange(1, 255));
106
5/10
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1888 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1888 times.
✗ Branch 9 not taken.
11328 args.push_back(CommandArg("SlotD", "int", "Preset Slot D").setRange(1, 255));
107 1888 }
108 4 std::unique_ptr<Command::Result> TriggerMultiplePresetSlotsCommand::run(const std::vector<std::string>& args) {
109
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 if (args.empty()) {
110 ✗ return std::make_unique<Command::ErrorResult>("Not found");
111 }
112 4 std::string slotList;
113
2/2
✓ Branch 0 taken 13 times.
✓ Branch 1 taken 4 times.
17 for (auto& a : args) {
114
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 7 times.
13 if (a.length() > 0) {
115
4/6
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
6 slotList += (slotList.empty() ? "" : ", ") + a;
116 }
117 }
118
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 LogDebug(VB_COMMAND, "\"Trigger Multiple Command Preset Slots\" command triggering slots: %s\n", slotList.c_str());
119
2/2
✓ Branch 0 taken 13 times.
✓ Branch 1 taken 4 times.
17 for (auto& a : args) {
120
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 7 times.
13 if (a.length() > 0) {
121 6 int slot = ParsePresetSlot(a);
122
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
6 if (slot == 0) {
123
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 LogWarn(VB_COMMAND, "\"Trigger Multiple Command Preset Slots\" skipping invalid slot \"%s\"\n", a.c_str());
124 2 continue;
125 }
126
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 CommandManager::INSTANCE.TriggerPreset(slot);
127 }
128 }
129
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 return std::make_unique<Command::Result>("Presets Triggered");
130 4 }
131
132 1888 TriggerMultiplePresetsCommand::TriggerMultiplePresetsCommand() :
133
2/4
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
3776 Command("Trigger Multiple Command Presets") {
134
7/14
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1888 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1888 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1888 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1888 times.
✗ Branch 13 not taken.
15104 args.push_back(CommandArg("NameA", "datalist", "Preset Name 1").setContentListUrl("api/commandPresets?names=true"));
135
7/14
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1888 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1888 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1888 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1888 times.
✗ Branch 13 not taken.
15104 args.push_back(CommandArg("NameB", "datalist", "Preset Name 2").setContentListUrl("api/commandPresets?names=true"));
136
7/14
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1888 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1888 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1888 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1888 times.
✗ Branch 13 not taken.
15104 args.push_back(CommandArg("NameC", "datalist", "Preset Name 3").setContentListUrl("api/commandPresets?names=true"));
137
7/14
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1888 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1888 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1888 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1888 times.
✗ Branch 13 not taken.
15104 args.push_back(CommandArg("NameD", "datalist", "Preset Name 4").setContentListUrl("api/commandPresets?names=true"));
138
7/14
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1888 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1888 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1888 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1888 times.
✗ Branch 13 not taken.
15104 args.push_back(CommandArg("NameE", "datalist", "Preset Name 5").setContentListUrl("api/commandPresets?names=true"));
139
7/14
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1888 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1888 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1888 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1888 times.
✗ Branch 13 not taken.
15104 args.push_back(CommandArg("NameF", "datalist", "Preset Name 6").setContentListUrl("api/commandPresets?names=true"));
140 1888 }
141 2 std::unique_ptr<Command::Result> TriggerMultiplePresetsCommand::run(const std::vector<std::string>& args) {
142
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (args.empty()) {
143 ✗ return std::make_unique<Command::ErrorResult>("Not found");
144 }
145 2 std::string nameList;
146
2/2
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 2 times.
9 for (auto& a : args) {
147
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 2 times.
7 if (!a.empty()) {
148
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
5 nameList += (nameList.empty() ? "" : ", ") + a;
149 }
150 }
151
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 LogDebug(VB_COMMAND, "\"Trigger Multiple Command Presets\" command triggering presets: %s\n", nameList.c_str());
152
2/2
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 2 times.
9 for (auto& a : args) {
153
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 2 times.
7 if (!a.empty()) {
154
2/4
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
5 CommandManager::INSTANCE.TriggerPreset(a);
155 }
156 }
157
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 return std::make_unique<Command::Result>("Presets Triggered");
158 2 }
159
160 1888 RunScriptEvent::RunScriptEvent() :
161
2/4
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
3776 Command("Run Script") {
162
7/14
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1888 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1888 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1888 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1888 times.
✗ Branch 13 not taken.
15104 args.push_back(CommandArg("script", "string", "Script Name").setContentListUrl("api/scripts"));
163
5/10
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1888 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1888 times.
✗ Branch 9 not taken.
11328 args.push_back(CommandArg("args", "string", "Script Arguments").setAdjustable());
164
5/10
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1888 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1888 times.
✗ Branch 9 not taken.
11328 args.push_back(CommandArg("env", "string", "Environment Variables"));
165 1888 }
166 29 std::unique_ptr<Command::Result> RunScriptEvent::run(const std::vector<std::string>& args) {
167
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 29 times.
29 if (args.empty()) {
168 ✗ return std::make_unique<Command::ErrorResult>("Not found");
169 }
170
1/2
✓ Branch 0 taken 29 times.
✗ Branch 1 not taken.
29 std::string script = args[0];
171
1/2
✓ Branch 0 taken 29 times.
✗ Branch 1 not taken.
29 std::string scriptArgs = "";
172 29 std::vector<std::pair<std::string, std::string>> envVars;
173
2/2
✓ Branch 0 taken 25 times.
✓ Branch 1 taken 4 times.
29 if (args.size() > 1) {
174
1/2
✓ Branch 0 taken 25 times.
✗ Branch 1 not taken.
25 scriptArgs = args[1];
175 }
176
2/2
✓ Branch 0 taken 25 times.
✓ Branch 1 taken 4 times.
29 if (args.size() > 2) {
177
1/2
✓ Branch 0 taken 25 times.
✗ Branch 1 not taken.
25 std::vector<std::string> s = splitWithQuotes(args[2], ',');
178
2/2
✓ Branch 0 taken 28 times.
✓ Branch 1 taken 25 times.
53 for (auto& a : s) {
179 28 size_t idx = a.find('=');
180 // skip an entry with no "=" or no name, such as the empty one the UI sends
181
3/4
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
28 if (idx == std::string::npos || idx == 0) {
182 25 continue;
183 }
184
3/6
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 envVars.push_back(std::pair<std::string, std::string>(a.substr(0, idx), a.substr(idx + 1)));
185 }
186 25 }
187
188
6/10
✓ Branch 0 taken 29 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 29 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 29 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 29 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✓ Branch 9 taken 27 times.
29 if (RunScript(script, scriptArgs, envVars) < 1) {
189
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 return std::make_unique<Command::ErrorResult>("Script Not Started");
190 }
191
1/2
✓ Branch 0 taken 27 times.
✗ Branch 1 not taken.
27 return std::make_unique<Command::Result>("Script Started");
192 29 }
193
194 1888 StartEffectCommand::StartEffectCommand() :
195
2/4
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
3776 Command("Effect Start") {
196
7/14
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1888 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1888 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1888 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1888 times.
✗ Branch 13 not taken.
15104 args.push_back(CommandArg("effect", "string", "Effect Name").setContentListUrl("api/effects"));
197
5/10
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1888 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1888 times.
✗ Branch 9 not taken.
11328 args.push_back(CommandArg("startChannel", "int", "Start Channel"));
198
6/12
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1888 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1888 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1888 times.
✗ Branch 11 not taken.
11328 args.push_back(CommandArg("loop", "bool", "Loop Effect").setDefaultValue("true"));
199
5/10
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1888 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1888 times.
✗ Branch 9 not taken.
11328 args.push_back(CommandArg("bg", "bool", "Background"));
200
4/8
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1888 times.
✗ Branch 7 not taken.
13216 args.push_back(CommandArg("ifNotRunning", "bool", "If Not Running", true)
201
1/2
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
1888 .setDefaultValue("false")
202
3/6
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
3776 .setHelp("Checks to see if this exact item is already running and "
203 "prevents it from running again."));
204
7/14
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1888 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1888 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1888 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1888 times.
✗ Branch 13 not taken.
15104 args.push_back(CommandArg("Model", "string", "Model").setContentListUrl("api/models?simple=true", true));
205 1888 }
206 44 std::unique_ptr<Command::Result> StartEffectCommand::run(const std::vector<std::string>& args) {
207
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 44 times.
44 if (args.empty()) {
208 ✗ return std::make_unique<Command::ErrorResult>("Not found");
209 }
210
211 44 int startChannel = 0;
212 44 bool loop = false;
213 44 bool bg = false;
214 44 bool iNR = false;
215 44 bool isRunning = false;
216
1/2
✓ Branch 0 taken 44 times.
✗ Branch 1 not taken.
44 std::string Model = "";
217
218
1/2
✓ Branch 0 taken 44 times.
✗ Branch 1 not taken.
44 if (args.size() > 1) {
219 44 startChannel = std::atoi(args[1].c_str());
220 }
221
1/2
✓ Branch 0 taken 44 times.
✗ Branch 1 not taken.
44 if (args.size() > 2) {
222
5/8
✓ Branch 0 taken 44 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 7 times.
✓ Branch 3 taken 37 times.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 7 times.
44 loop = args[2] == "true" || args[2] == "1";
223 }
224
1/2
✓ Branch 0 taken 44 times.
✗ Branch 1 not taken.
44 if (args.size() > 3) {
225
5/8
✓ Branch 0 taken 44 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 42 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 42 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 42 times.
44 bg = args[3] == "true" || args[3] == "1";
226 }
227
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 44 times.
44 if (args.size() > 4) {
228 ✗ iNR = args[4] == "true" || args[4] == "1";
229 }
230
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 44 times.
44 if (args.size() > 5) {
231 ✗ Model = args[5].c_str();
232 ✗ if (Model != "") {
233 // A reference, not getModel()'s raw pointer: an output reload
234 // can free the model between the lookup and its use below.
235 ✗ auto m_model = PixelOverlayManager::INSTANCE.getModelShared(Model);
236 ✗ if (!m_model) {
237 ✗ LogErr(VB_COMMAND, "Invalid Pixel Overlay Model: '%s'\n", Model.c_str());
238 } else {
239 ✗ if (args[1] == "")
240 ✗ startChannel = 1;
241 ✗ LogDebug(VB_COMMAND, "Overlay Model start channel modified to be : '%i'\n", m_model->getStartChannel() + startChannel);
242 ✗ startChannel = m_model->getStartChannel() + startChannel;
243 }
244 ✗ }
245 }
246
247
1/2
✓ Branch 0 taken 44 times.
✗ Branch 1 not taken.
44 const Json::Value RunningEffects = GetRunningEffectsJson();
248
249
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 44 times.
44 if (iNR) {
250 ✗ for (int x = 0; x < RunningEffects.size(); x++) {
251 ✗ Json::Value v = RunningEffects[x];
252 ✗ if (v["name"].asString() == args[0]) {
253 ✗ isRunning = true;
254 ✗ LogDebug(VB_COMMAND, "Effect Already running, configured not to start it again\n");
255 ✗ return std::make_unique<Command::Result>("Effect NOT Started");
256 }
257 ✗ }
258 }
259
260
1/2
✓ Branch 0 taken 44 times.
✗ Branch 1 not taken.
44 StartEffect(args[0], startChannel, loop, bg);
261
1/2
✓ Branch 0 taken 44 times.
✗ Branch 1 not taken.
44 return std::make_unique<Command::Result>("Effect Started");
262 44 }
263
264 1888 StartFSEQAsEffectCommand::StartFSEQAsEffectCommand() :
265
2/4
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
3776 Command("FSEQ Effect Start") {
266
7/14
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1888 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1888 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1888 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1888 times.
✗ Branch 13 not taken.
15104 args.push_back(CommandArg("effect", "string", "FSEQ Name").setContentListUrl("api/sequence"));
267
6/12
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1888 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1888 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1888 times.
✗ Branch 11 not taken.
11328 args.push_back(CommandArg("loop", "bool", "Loop Effect").setDefaultValue("true"));
268
5/10
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1888 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1888 times.
✗ Branch 9 not taken.
11328 args.push_back(CommandArg("bg", "bool", "Background"));
269
4/8
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1888 times.
✗ Branch 7 not taken.
13216 args.push_back(CommandArg("ifNotRunning", "bool", "If Not Running", true)
270
1/2
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
1888 .setDefaultValue("false")
271
3/6
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
3776 .setHelp("Checks to see if this exact item is already running and "
272 "prevents it from running again."));
273
4/8
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1888 times.
✗ Branch 7 not taken.
13216 args.push_back(CommandArg("restartIfRunning", "bool", "Restart If Running", true)
274
1/2
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
1888 .setDefaultValue("false")
275
3/6
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
3776 .setHelp("If this exact item is already running, restart it from the "
276 "beginning in place instead of starting a second instance. "
277 "Ignored if 'If Not Running' is also set."));
278 1888 }
279 159 std::unique_ptr<Command::Result> StartFSEQAsEffectCommand::run(const std::vector<std::string>& args) {
280
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 159 times.
159 if (args.empty()) {
281 ✗ return std::make_unique<Command::ErrorResult>("Not found");
282 }
283
284 159 bool loop = false;
285 159 bool bg = false;
286 159 bool iNR = false;
287 159 bool restartIfRunning = false;
288
289
1/2
✓ Branch 0 taken 159 times.
✗ Branch 1 not taken.
159 if (args.size() > 1) {
290
3/4
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 150 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 9 times.
159 loop = args[1] == "true" || args[1] == "1";
291 }
292
1/2
✓ Branch 0 taken 159 times.
✗ Branch 1 not taken.
159 if (args.size() > 2) {
293
2/4
✓ Branch 0 taken 159 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 159 times.
159 bg = args[2] == "true" || args[2] == "1";
294 }
295
1/2
✓ Branch 0 taken 159 times.
✗ Branch 1 not taken.
159 if (args.size() > 3) {
296
3/4
✓ Branch 0 taken 158 times.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 158 times.
159 iNR = args[3] == "true" || args[3] == "1";
297 }
298
1/2
✓ Branch 0 taken 159 times.
✗ Branch 1 not taken.
159 if (args.size() > 4) {
299
3/4
✓ Branch 0 taken 158 times.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 158 times.
159 restartIfRunning = args[4] == "true" || args[4] == "1";
300 }
301
302
4/4
✓ Branch 0 taken 158 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 157 times.
159 if (iNR || restartIfRunning) {
303
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 const Json::Value RunningEffects = GetRunningEffectsJson();
304
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 for (int x = 0; x < RunningEffects.size(); x++) {
305
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 Json::Value v = RunningEffects[x];
306
3/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 if (v["name"].asString() == args[0]) {
307
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
2 if (iNR) {
308
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 LogDebug(VB_COMMAND, "Effect Already running, configured not to start it again\n");
309
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 return std::make_unique<Command::Result>("Effect NOT Started");
310 }
311 // restartIfRunning: jump the already-running instance back to frame 0
312 // in place rather than tearing it down and opening a new one - reuses
313 // its existing read-ahead thread instead of spinning up another.
314
4/8
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
1 if (RestartEffect(v["id"].asInt(), args[0])) {
315
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 return std::make_unique<Command::Result>("Effect Restarted");
316 }
317 }
318
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 }
319
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 }
320
321 157 StartFSEQAsEffect(args[0], loop, bg);
322 157 return std::make_unique<Command::Result>("Effect Started");
323 }
324
325 1888 StopEffectCommand::StopEffectCommand() :
326
3/6
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
7552 Command("Effect Stop", "Stop the specified effect.") {
327
7/14
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1888 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1888 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1888 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1888 times.
✗ Branch 13 not taken.
15104 args.push_back(CommandArg("effect", "string", "Effect Name").setContentListUrl("api/effects"));
328 1888 }
329 21 std::unique_ptr<Command::Result> StopEffectCommand::run(const std::vector<std::string>& args) {
330
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 21 times.
21 if (args.empty()) {
331 ✗ return std::make_unique<Command::ErrorResult>("Not found");
332 }
333
334 21 StopEffect(args[0]);
335 21 return std::make_unique<Command::Result>("Effect Stopped");
336 }
337
338 1888 StopAllEffectsCommand::StopAllEffectsCommand() :
339
3/6
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
7552 Command("Effects Stop", "Stop all running effects.") {
340 1888 }
341 7 std::unique_ptr<Command::Result> StopAllEffectsCommand::run(const std::vector<std::string>& args) {
342 7 StopAllEffects();
343 7 return std::make_unique<Command::Result>("Effects Stopped");
344 }
345
346 1888 StopFSEQAsEffectCommand::StopFSEQAsEffectCommand() :
347
2/4
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
3776 Command("FSEQ Effect Stop") {
348
7/14
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1888 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1888 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1888 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1888 times.
✗ Branch 13 not taken.
15104 args.push_back(CommandArg("effect", "string", "FSEQ Name").setContentListUrl("api/sequence"));
349 1888 }
350 1 std::unique_ptr<Command::Result> StopFSEQAsEffectCommand::run(const std::vector<std::string>& args) {
351
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if (args.empty()) {
352 ✗ return std::make_unique<Command::ErrorResult>("Not found");
353 }
354
355 1 StopEffect(args[0]);
356 1 return std::make_unique<Command::Result>("Effect Stopped");
357 }
358
359 1888 AllLightsOffCommand::AllLightsOffCommand() :
360
3/6
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
7552 Command("All Lights Off", "Turn all lights off.") {
361 1888 }
362 677 std::unique_ptr<Command::Result> AllLightsOffCommand::run(const std::vector<std::string>& args) {
363 677 sequence->SendBlankingData();
364 677 return std::make_unique<Command::Result>("All Lights Off");
365 }
366
367 1888 SwitchToPlayerModeCommand::SwitchToPlayerModeCommand() :
368
3/6
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
7552 Command("Switch To Player Mode", "Restart FPP in Player Mode.") {
369 1888 }
370 1 std::unique_ptr<Command::Result> SwitchToPlayerModeCommand::run(const std::vector<std::string>& args) {
371
2/4
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 std::string cmd(getFPPDDir("/scripts/common setSetting fppMode player"));
372
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 system(cmd.c_str());
373
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 ShutdownFPPD(true);
374
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 return std::make_unique<Command::Result>("Switch To Player Mode");
375 1 }
376
377 1888 SwitchToRemoteModeCommand::SwitchToRemoteModeCommand() :
378
3/6
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
7552 Command("Switch To Remote Mode", "Restart FPP in Remote Mode.") {
379 1888 }
380 1 std::unique_ptr<Command::Result> SwitchToRemoteModeCommand::run(const std::vector<std::string>& args) {
381
2/4
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 std::string cmd(getFPPDDir("/scripts/common setSetting fppMode remote"));
382
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 system(cmd.c_str());
383
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 ShutdownFPPD(true);
384
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 return std::make_unique<Command::Result>("Switch To Remote Mode");
385 1 }
386
387 1888 RebootCommand::RebootCommand() :
388
3/6
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
7552 Command("Reboot", "Reboot the Device. Requires confirmation.") {
389
5/10
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1888 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1888 times.
✗ Branch 9 not taken.
11328 args.push_back(CommandArg("confirm", "bool", "Confirm System Reboot"));
390 1888 }
391 3 std::unique_ptr<Command::Result> RebootCommand::run(const std::vector<std::string>& args) {
392 #ifdef PLATFORM_OSX
393 return std::make_unique<Command::ErrorResult>(" Reboot is not supported on this platform (macOS).");
394 #endif
395
2/4
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
3 if (FileExists("/etc/fpp/container")) {
396 ✗ return std::make_unique<Command::ErrorResult>(" Reboot is not supported when running in a container.");
397 }
398
8/12
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 1 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✓ Branch 11 taken 1 times.
3 if (args.empty() || (args[0] != "true" && args[0] != "1")) {
399
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 LogWarn(VB_CONTROL, "Reboot Command: rejected, confirmation not given\n");
400
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 return std::make_unique<Command::ErrorResult>(" Confirmation not given. Reboot aborted.");
401 }
402
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 LogInfo(VB_CONTROL, "Reboot Command: rebooting Ddevice by FPP Command\n");
403 1 std::string rc;
404
3/6
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
3 urlPost("http://localhost/api/system/reboot", "", rc);
405
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 return std::make_unique<Command::Result>("Reboot initiated");
406 1 }
407
408 1888 ShutdownCommand::ShutdownCommand() :
409
3/6
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
7552 Command("Shutdown", "Shut down the OS. Requires confirmation.") {
410
5/10
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1888 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1888 times.
✗ Branch 9 not taken.
11328 args.push_back(CommandArg("confirm", "bool", "Confirm System Shutdown"));
411 1888 }
412 3 std::unique_ptr<Command::Result> ShutdownCommand::run(const std::vector<std::string>& args) {
413 #ifdef PLATFORM_OSX
414 return std::make_unique<Command::ErrorResult>(" Shutdown is not supported on this platform (macOS).");
415 #endif
416
2/4
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
3 if (FileExists("/etc/fpp/container")) {
417 ✗ return std::make_unique<Command::ErrorResult>(" Shutdown is not supported when running in a container.");
418 }
419
8/12
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 1 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✓ Branch 11 taken 1 times.
3 if (args.empty() || (args[0] != "true" && args[0] != "1")) {
420
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 LogWarn(VB_CONTROL, "Shutdown Command: rejected, confirmation not given\n");
421
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 return std::make_unique<Command::ErrorResult>(" Confirmation not given. Shutdown aborted.");
422 }
423
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 LogInfo(VB_CONTROL, "Shutdown Command: shutting down OS by FPP Command\n");
424 1 std::string rc;
425
3/6
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
3 urlPost("http://localhost/api/system/shutdown", "", rc);
426
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 return std::make_unique<Command::Result>("Shutdown initiated");
427 1 }
428
429 1888 RestartFPPDCommand::RestartFPPDCommand() :
430
3/6
✓ Branch 0 taken 1888 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1888 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1888 times.
✗ Branch 5 not taken.
7552 Command("Restart FPPD", "Restart the FPPD daemon.") {
431 1888 }
432 5 std::unique_ptr<Command::Result> RestartFPPDCommand::run(const std::vector<std::string>& args) {
433 5 LogInfo(VB_CONTROL, "Restart FPPD Command: restarting FPPD by FPP Command\n");
434 5 ShutdownFPPD(true);
435 5 return std::make_unique<Command::Result>("FPPD restart initiated");
436 }
437