blob: 4816b8452ddc81c3b8b4a725c3c85012b614480c [file] [log] [blame]
Vishwanatha Subbannaaffea8b2017-04-04 14:02:16 +05301/**
2 * Copyright © 2016 IBM Corporation
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
Vishwanatha Subbannaaffea8b2017-04-04 14:02:16 +053017#include "argument.hpp"
Vishwanatha Subbanna4902a102017-04-04 14:05:09 +053018#include "monitor.hpp"
Vishwanatha Subbannaaffea8b2017-04-04 14:02:16 +053019
Patrick Venturedace6802018-11-01 16:52:10 -070020#include <systemd/sd-event.h>
21
Patrick Venturedace6802018-11-01 16:52:10 -070022#include <phosphor-logging/log.hpp>
Patrick Williams39084b42023-05-10 07:50:58 -050023
24#include <iostream>
Patrick Venturedace6802018-11-01 16:52:10 -070025#include <string>
26
Vishwanatha Subbanna0b956032017-04-04 14:07:25 +053027using namespace phosphor::logging;
Vishwanatha Subbannaaffea8b2017-04-04 14:02:16 +053028static void exitWithError(const char* err, char** argv)
29{
30 phosphor::gpio::ArgumentParser::usage(argv);
31 std::cerr << "ERROR: " << err << "\n";
32 exit(EXIT_FAILURE);
33}
34
35int main(int argc, char** argv)
36{
37 // Read arguments.
38 auto options = phosphor::gpio::ArgumentParser(argc, argv);
39
40 // Parse out path argument.
41 auto path = (options)["path"];
42 if (path == phosphor::gpio::ArgumentParser::emptyString)
43 {
44 exitWithError("path not specified.", argv);
45 }
46
47 // Parse out key number that we are interested in
48 // Its integer mapping to the GPIO key configured by the kernel
49 auto key = (options)["key"];
50 if (key == phosphor::gpio::ArgumentParser::emptyString)
51 {
52 exitWithError("Key not specified.", argv);
53 }
Vishwanatha Subbannaaffea8b2017-04-04 14:02:16 +053054
55 // Parse out assertion polarity interested in
56 // Its either 1 or 0 for press / release
57 auto polarity = (options)["polarity"];
58 if (polarity == phosphor::gpio::ArgumentParser::emptyString)
59 {
60 exitWithError("Polarity not specified.", argv);
61 }
Vishwanatha Subbannaaffea8b2017-04-04 14:02:16 +053062
63 // Parse out target argument. It is fine if the caller does not
64 // pass this if they are not interested in calling into any target
65 // on meeting a condition.
66 auto target = (options)["target"];
67
Lei YUbc4a4ff2018-04-11 13:33:25 +080068 bool continueRun =
Patrick Venturedace6802018-11-01 16:52:10 -070069 (options["continue"] == phosphor::gpio::ArgumentParser::trueString);
Lei YUbc4a4ff2018-04-11 13:33:25 +080070
Vishwanatha Subbanna0b956032017-04-04 14:07:25 +053071 sd_event* event = nullptr;
72 auto r = sd_event_default(&event);
73 if (r < 0)
74 {
75 log<level::ERR>("Error creating a default sd_event handler");
76 return r;
77 }
78 phosphor::gpio::EventPtr eventP{event};
79 event = nullptr;
80
81 // Create a monitor object and let it do all the rest
Patrick Venturedace6802018-11-01 16:52:10 -070082 phosphor::gpio::Monitor monitor(path, std::stoi(key), std::stoi(polarity),
83 target, eventP, continueRun);
Vishwanatha Subbannaba730132017-04-04 14:08:26 +053084
85 // Wait for client requests until this application has processed
86 // at least one expected GPIO state change
Patrick Venturedace6802018-11-01 16:52:10 -070087 while (!monitor.completed())
Vishwanatha Subbannaba730132017-04-04 14:08:26 +053088 {
89 // -1 denotes wait for ever
90 r = sd_event_run(eventP.get(), (uint64_t)-1);
91 if (r < 0)
92 {
93 log<level::ERR>("Failure in processing request",
Patrick Venturedace6802018-11-01 16:52:10 -070094 entry("ERROR=%s", strerror(-r)));
Vishwanatha Subbannaba730132017-04-04 14:08:26 +053095 break;
96 }
97 }
Vishwanatha Subbanna4902a102017-04-04 14:05:09 +053098
Vishwanatha Subbannaaffea8b2017-04-04 14:02:16 +053099 return 0;
100}