LoRaWANCH341 Library
Loading...
Searching...
No Matches
LinuxSPI.hpp
Go to the documentation of this file.
1
17#pragma once
18
19#include "SPIInterface.hpp"
20#include <string>
21#include <thread>
22#include <atomic>
23#include <map>
24#include <fstream>
25#include <fcntl.h>
26
27#ifdef _WIN32
28#include <io.h>
29#else
30#include <unistd.h>
31#endif
32
40class LinuxSPI : public SPIInterface {
41 public:
49 LinuxSPI(const std::string& device = "/dev/spidev0.0",
50 uint32_t speed = 1000000,
51 uint8_t mode = 0);
52
56 ~LinuxSPI();
57
63 bool open();
64
68 void close();
69
77 std::vector<uint8_t> transfer(const std::vector<uint8_t>& write_data, size_t read_length = 0);
78
86 bool digitalWrite(uint8_t pin, bool value);
87
94 bool digitalRead(uint8_t pin);
95
103 bool pinMode(uint8_t pin, uint8_t mode);
104
112 bool configureInterrupt(uint8_t pin, bool enable) override {
113 // Basic implementation using sysfs
114 // In a real implementation, would use proper GPIO interrupts
115 std::string gpio_path = "/sys/class/gpio/gpio" + std::to_string(pin);
116
117 // Check if GPIO exists
118 if (access(gpio_path.c_str(), F_OK) == -1) {
119 // Need to export
120 std::ofstream export_file("/sys/class/gpio/export");
121 if (!export_file.is_open()) {
122 return false;
123 }
124 export_file << pin;
125 export_file.close();
126 }
127
128 // Configure edge for interrupt
129 std::string edge_path = gpio_path + "/edge";
130 std::ofstream edge_file(edge_path);
131 if (!edge_file.is_open()) {
132 return false;
133 }
134 edge_file << (enable ? "both" : "none");
135 edge_file.close();
136
137 return true;
138 }
139
146 bool setInterruptCallback(InterruptCallback callback) override;
147
154 bool enableInterrupt(bool enable) override;
155
161 bool isActive() const override {
162 return fd >= 0;
163 }
164
165private:
166 std::string device_path;
167 uint32_t speed_hz;
168 uint8_t spi_mode;
169 int fd; // File descriptor para el dispositivo SPI
170
171 // GPIO paths
172 std::string gpio_export_path;
174 std::map<uint8_t, std::string> gpio_pin_paths;
175
176 // Interrupt handling
178 std::atomic<bool> interrupt_running;
179 std::thread interrupt_thread;
182 bool interrupt_enabled = false;
183
190 bool exportGPIO(uint8_t pin);
191
198 bool unexportGPIO(uint8_t pin);
199
207 bool setGPIODirection(uint8_t pin, const std::string& direction);
208
216 bool writeGPIOValue(uint8_t pin, bool value);
217
224 bool readGPIOValue(uint8_t pin);
225
226 void interruptThread();
227};
228
229
230
231
Implementation of SPIInterface using Linux spidev.
Definition LinuxSPI.hpp:40
bool digitalWrite(uint8_t pin, bool value)
Sets the value of a GPIO pin.
Definition LinuxSPI.cpp:272
std::string gpio_export_path
Definition LinuxSPI.hpp:172
int interrupt_pin
Definition LinuxSPI.hpp:180
std::vector< uint8_t > transfer(const std::vector< uint8_t > &write_data, size_t read_length=0)
Transfers data over the SPI interface.
Definition LinuxSPI.cpp:96
void close()
Closes the SPI device.
Definition LinuxSPI.cpp:77
bool open()
Opens the SPI device.
Definition LinuxSPI.cpp:36
bool enableInterrupt(bool enable) override
Enable or disable interrupts.
Definition LinuxSPI.cpp:307
uint32_t speed_hz
Definition LinuxSPI.hpp:167
bool configureInterrupt(uint8_t pin, bool enable) override
Configure interrupt settings for a GPIO pin.
Definition LinuxSPI.hpp:112
bool writeGPIOValue(uint8_t pin, bool value)
Writes a value to a GPIO pin.
Definition LinuxSPI.cpp:221
bool digitalRead(uint8_t pin)
Reads the value of a GPIO pin.
Definition LinuxSPI.cpp:276
~LinuxSPI()
Destroys the LinuxSPI object.
Definition LinuxSPI.cpp:32
int fd
Definition LinuxSPI.hpp:169
bool readGPIOValue(uint8_t pin)
Reads the value of a GPIO pin.
Definition LinuxSPI.cpp:246
bool isActive() const override
Check if the device is active/connected.
Definition LinuxSPI.hpp:161
std::atomic< bool > interrupt_running
Definition LinuxSPI.hpp:178
bool setInterruptCallback(InterruptCallback callback) override
Set interrupt callback.
Definition LinuxSPI.cpp:302
std::string device_path
Definition LinuxSPI.hpp:166
InterruptCallback interruptCallback
Definition LinuxSPI.hpp:177
std::string gpio_unexport_path
Definition LinuxSPI.hpp:173
bool exportGPIO(uint8_t pin)
Exports a GPIO pin for use.
Definition LinuxSPI.cpp:143
std::thread interrupt_thread
Definition LinuxSPI.hpp:179
bool pinMode(uint8_t pin, uint8_t mode)
Sets the mode of a GPIO pin.
Definition LinuxSPI.cpp:280
InterruptCallback interrupt_callback
Definition LinuxSPI.hpp:181
bool setGPIODirection(uint8_t pin, const std::string &direction)
Sets the direction of a GPIO pin.
Definition LinuxSPI.cpp:194
uint8_t spi_mode
Definition LinuxSPI.hpp:168
bool unexportGPIO(uint8_t pin)
Unexports a GPIO pin.
Definition LinuxSPI.cpp:174
bool interrupt_enabled
Definition LinuxSPI.hpp:182
void interruptThread()
Definition LinuxSPI.cpp:351
std::map< uint8_t, std::string > gpio_pin_paths
Definition LinuxSPI.hpp:174
Abstract interface for SPI communication.
Definition SPIInterface.hpp:21
std::function< void(void)> InterruptCallback
Definition SPIInterface.hpp:89