blob: 16b7906004b7e4856dd1ce5647e0f2d65acb8aa7 [file] [log] [blame]
Enrico Granata60a818d2019-05-09 09:56:09 -07001// 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
Enrico Granata51cdb942019-06-18 16:40:17 -07005#ifndef LIBMEMS_IIO_DEVICE_IMPL_H_
6#define LIBMEMS_IIO_DEVICE_IMPL_H_
Enrico Granata60a818d2019-05-09 09:56:09 -07007
8#include <iio.h>
9
10#include <map>
11#include <memory>
12#include <string>
Harvey Yangc0d19d82019-07-01 12:17:34 +080013#include <vector>
Enrico Granata60a818d2019-05-09 09:56:09 -070014
15#include <base/optional.h>
16
Enrico Granata51cdb942019-06-18 16:40:17 -070017#include "libmems/export.h"
18#include "libmems/iio_device.h"
Enrico Granata60a818d2019-05-09 09:56:09 -070019
Enrico Granata51cdb942019-06-18 16:40:17 -070020namespace libmems {
Enrico Granata60a818d2019-05-09 09:56:09 -070021
22class IioChannelImpl;
23class IioContext;
24class IioContextImpl;
25
Enrico Granata51cdb942019-06-18 16:40:17 -070026class LIBMEMS_EXPORT IioDeviceImpl : public IioDevice {
Enrico Granata60a818d2019-05-09 09:56:09 -070027 public:
Harvey Yang9260b662019-08-12 15:48:03 +080028 static base::Optional<int> GetIdFromString(const char* id_str);
29 static std::string GetStringFromId(int id);
30
Enrico Granata60a818d2019-05-09 09:56:09 -070031 // iio_device objects are kept alive by the IioContextImpl.
32 IioDeviceImpl(IioContextImpl* ctx, iio_device* dev);
Qijiang Fan6bc59e12020-11-11 02:51:06 +090033 IioDeviceImpl(const IioDeviceImpl&) = delete;
34 IioDeviceImpl& operator=(const IioDeviceImpl&) = delete;
35
Enrico Granata60a818d2019-05-09 09:56:09 -070036 ~IioDeviceImpl() override = default;
37
38 IioContext* GetContext() const override;
39
40 const char* GetName() const override;
Harvey Yang9260b662019-08-12 15:48:03 +080041 int GetId() const override;
Enrico Granata60a818d2019-05-09 09:56:09 -070042
43 base::FilePath GetPath() const override;
44
45 base::Optional<std::string> ReadStringAttribute(
46 const std::string& name) const override;
47 base::Optional<int64_t> ReadNumberAttribute(
48 const std::string& name) const override;
Enrico Granatad2e57f42019-07-31 10:46:03 -070049 base::Optional<double> ReadDoubleAttribute(
50 const std::string& name) const override;
Enrico Granata60a818d2019-05-09 09:56:09 -070051
52 bool WriteStringAttribute(const std::string& name,
53 const std::string& value) override;
54 bool WriteNumberAttribute(const std::string& name, int64_t value) override;
Enrico Granatad2e57f42019-07-31 10:46:03 -070055 bool WriteDoubleAttribute(const std::string& name, double value) override;
Enrico Granata60a818d2019-05-09 09:56:09 -070056
Harvey Yangcbfe75e2021-01-21 09:35:25 +080057 bool HasFifo() const override;
58
Enrico Granata60a818d2019-05-09 09:56:09 -070059 iio_device* GetUnderlyingIioDevice() const override;
60
61 bool SetTrigger(IioDevice* trigger_device) override;
62 IioDevice* GetTrigger() override;
63
Harvey Yangc0d19d82019-07-01 12:17:34 +080064 base::Optional<size_t> GetSampleSize() const override;
65
Enrico Granata60a818d2019-05-09 09:56:09 -070066 bool EnableBuffer(size_t num) override;
67 bool DisableBuffer() override;
68 bool IsBufferEnabled(size_t* num = nullptr) const override;
69
Harvey Yangdf365182021-01-16 23:43:45 +080070 bool CreateBuffer() override;
Harvey Yange8b301b2020-05-19 14:43:03 +080071 base::Optional<int32_t> GetBufferFd() override;
Harvey Yang34c54d52020-05-20 13:34:20 +080072 base::Optional<IioSample> ReadSample() override;
Harvey Yangdf365182021-01-16 23:43:45 +080073 void FreeBuffer() override;
Harvey Yangc0d19d82019-07-01 12:17:34 +080074
Enrico Granata60a818d2019-05-09 09:56:09 -070075 private:
Harvey Yangc0d19d82019-07-01 12:17:34 +080076 static void IioBufferDeleter(iio_buffer* buffer);
77
Harvey Yang34c54d52020-05-20 13:34:20 +080078 IioSample DeserializeSample(const uint8_t* src);
79
Harvey Yangf0a0b232020-08-29 10:20:31 +080080 IioContextImpl* context_; // non-owned
81 iio_device* const device_; // non-owned
Harvey Yangc0d19d82019-07-01 12:17:34 +080082
83 using ScopedBuffer = std::unique_ptr<iio_buffer, decltype(&IioBufferDeleter)>;
84 ScopedBuffer buffer_;
Harvey Yang705e40f2020-11-19 15:42:44 +080085
86 std::string log_prefix_;
Enrico Granata60a818d2019-05-09 09:56:09 -070087};
88
Enrico Granata51cdb942019-06-18 16:40:17 -070089} // namespace libmems
Enrico Granata60a818d2019-05-09 09:56:09 -070090
Enrico Granata51cdb942019-06-18 16:40:17 -070091#endif // LIBMEMS_IIO_DEVICE_IMPL_H_