blob: 077a624fd64a9bad2edbc5b78a0e444df42a8be7 [file] [log] [blame]
Harvey Yang9260b662019-08-12 15:48:03 +08001// Copyright 2019 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4#include <string>
5
6#include <base/files/file_util.h>
7#include <base/logging.h>
8#include <base/strings/stringprintf.h>
9
10#include "libmems/common_types.h"
11#include "libmems/iio_channel.h"
12#include "libmems/iio_context_impl.h"
13#include "libmems/iio_device_trigger_impl.h"
14
15namespace {
16
17constexpr char kAddTrigger[] = "add_trigger";
18
19} // namespace
20
21namespace libmems {
22
23base::Optional<int> IioDeviceTriggerImpl::GetIdFromString(const char* id_str) {
24 size_t id_len = strlen(id_str);
25 if (id_len == strlen(kIioSysfsTrigger) &&
26 strncmp(id_str, kIioSysfsTrigger, id_len) == 0) {
27 return -1;
28 }
29
30 return IioDevice::GetIdAfterPrefix(id_str, kTriggerIdPrefix);
31}
32
33std::string IioDeviceTriggerImpl::GetStringFromId(int id) {
34 if (id == -1)
35 return std::string(kIioSysfsTrigger);
36 return base::StringPrintf("trigger%d", id);
37}
38
39IioDeviceTriggerImpl::IioDeviceTriggerImpl(IioContextImpl* ctx, iio_device* dev)
40 : IioDevice(), context_(ctx), trigger_(dev) {
41 CHECK(context_);
42 CHECK(trigger_);
Harvey Yang3b87b1d2020-12-04 15:38:20 +080043
44 log_prefix_ = base::StringPrintf("Trigger with id: %d and name: %s. ",
45 GetId(), (GetName() ? GetName() : "null"));
Harvey Yang9260b662019-08-12 15:48:03 +080046}
47
48IioContext* IioDeviceTriggerImpl::GetContext() const {
49 return context_;
50}
51
52const char* IioDeviceTriggerImpl::GetName() const {
53 return iio_device_get_name(trigger_);
54}
55
56int IioDeviceTriggerImpl::GetId() const {
57 const char* id_str = iio_device_get_id(trigger_);
58
59 auto id = GetIdFromString(id_str);
60 DCHECK(id.has_value());
61 return id.value();
62}
63
64base::FilePath IioDeviceTriggerImpl::GetPath() const {
65 int id = GetId();
66 std::string id_str = std::string(kIioSysfsTrigger);
67 if (id >= 0)
68 id_str = GetStringFromId(id);
69
Harvey Yang36779e92020-08-26 10:46:15 +080070 auto path = base::FilePath(kSysDevString).Append(id_str);
Harvey Yang9260b662019-08-12 15:48:03 +080071 CHECK(base::DirectoryExists(path));
72 return path;
73}
74
75base::Optional<std::string> IioDeviceTriggerImpl::ReadStringAttribute(
76 const std::string& name) const {
77 char data[kReadAttrBufferSize] = {0};
78 ssize_t len =
79 iio_device_attr_read(trigger_, name.c_str(), data, sizeof(data));
80 if (len < 0) {
Harvey Yang3b87b1d2020-12-04 15:38:20 +080081 LOG(WARNING) << log_prefix_ << "Attempting to read string attribute "
82 << name << " failed: " << len;
Harvey Yang9260b662019-08-12 15:48:03 +080083 return base::nullopt;
84 }
85 return std::string(data, len);
86}
87
88base::Optional<int64_t> IioDeviceTriggerImpl::ReadNumberAttribute(
89 const std::string& name) const {
90 long long val = 0; // NOLINT(runtime/int)
91 int error = iio_device_attr_read_longlong(trigger_, name.c_str(), &val);
92 if (error) {
Harvey Yang3b87b1d2020-12-04 15:38:20 +080093 LOG(WARNING) << log_prefix_ << "Attempting to read number attribute "
94 << name << " failed: " << error;
Harvey Yang9260b662019-08-12 15:48:03 +080095 return base::nullopt;
96 }
97 return val;
98}
99
Harvey Yang0c0039a2020-12-02 14:45:59 +0800100base::Optional<double> IioDeviceTriggerImpl::ReadDoubleAttribute(
101 const std::string& name) const {
102 double val = 0;
103 int error = iio_device_attr_read_double(trigger_, name.c_str(), &val);
104 if (error) {
Harvey Yang3b87b1d2020-12-04 15:38:20 +0800105 LOG(WARNING) << log_prefix_ << "Attempting to read double attribute "
106 << name << " failed: " << error;
Harvey Yang0c0039a2020-12-02 14:45:59 +0800107 return base::nullopt;
108 }
109 return val;
110}
111
Harvey Yang9260b662019-08-12 15:48:03 +0800112bool IioDeviceTriggerImpl::WriteNumberAttribute(const std::string& name,
113 int64_t value) {
114 int id = GetId();
115 if ((id == -1 && name.compare(kAddTrigger) != 0) ||
Harvey Yang0c0039a2020-12-02 14:45:59 +0800116 (id != -1 && name.compare(kSamplingFrequencyAttr) != 0)) {
Harvey Yang9260b662019-08-12 15:48:03 +0800117 return false;
Harvey Yang0c0039a2020-12-02 14:45:59 +0800118 }
Harvey Yang9260b662019-08-12 15:48:03 +0800119
120 int error = iio_device_attr_write_longlong(trigger_, name.c_str(), value);
121 if (error) {
Harvey Yang3b87b1d2020-12-04 15:38:20 +0800122 LOG(WARNING) << log_prefix_ << "Attempting to write number attribute "
123 << name << " failed: " << error;
Harvey Yang9260b662019-08-12 15:48:03 +0800124 return false;
125 }
126 return true;
127}
128
Harvey Yang0c0039a2020-12-02 14:45:59 +0800129bool IioDeviceTriggerImpl::WriteDoubleAttribute(const std::string& name,
130 double value) {
131 int id = GetId();
132 if ((id == -1 && name.compare(kAddTrigger) != 0) ||
133 (id != -1 && name.compare(kSamplingFrequencyAttr) != 0)) {
134 return false;
135 }
136
137 int error = iio_device_attr_write_double(trigger_, name.c_str(), value);
138 if (error) {
Harvey Yang3b87b1d2020-12-04 15:38:20 +0800139 LOG(WARNING) << log_prefix_ << "Attempting to write double attribute "
140 << name << " failed: " << error;
Harvey Yang0c0039a2020-12-02 14:45:59 +0800141 return false;
142 }
143 return true;
144}
145
Harvey Yang9260b662019-08-12 15:48:03 +0800146} // namespace libmems