arduino-emulator
Loading...
Searching...
No Matches
HardwareGPIO_FTDI.h
1#pragma once
2/*
3 HardwareGPIO_FTDI.h
4 Copyright (c) 2025 Phil Schatzmann. All right reserved.
5
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
10
11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public
17 License along with this library; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19*/
20#ifdef USE_FTDI
21#include <ftdi.h>
22// Undefine DEPRECATED macro from libftdi1 to avoid conflict with Arduino API
23#ifdef DEPRECATED
24#undef DEPRECATED
25#endif
26#include "HardwareGPIO.h"
27#include <map>
28#include <thread>
29#include <atomic>
30#include <mutex>
31#include <chrono>
32
33namespace arduino {
34
54 public:
58 HardwareGPIO_FTDI() = default;
59
64
73 bool begin(int vendor_id = 0x0403, int product_id = 0x6010,
74 const char* description = nullptr, const char* serial = nullptr);
75
79 void end();
80
86 void pinMode(pin_size_t pinNumber, PinMode pinMode) override;
87
93 void digitalWrite(pin_size_t pinNumber, PinStatus status) override;
94
100 PinStatus digitalRead(pin_size_t pinNumber) override;
101
107 int analogRead(pin_size_t pinNumber) override;
108
113 void analogReference(uint8_t mode) override;
114
120 void analogWrite(pin_size_t pinNumber, int value) override;
121
127 void analogWriteFrequency(pin_size_t pinNumber, uint32_t frequency);
128
135 void tone(uint8_t _pin, unsigned int frequency,
136 unsigned long duration = 0) override;
137
142 void noTone(uint8_t _pin) override;
143
151 unsigned long pulseIn(uint8_t pin, uint8_t state,
152 unsigned long timeout = 1000000L) override;
153
161 unsigned long pulseInLong(uint8_t pin, uint8_t state,
162 unsigned long timeout = 1000000L) override;
163
169 void analogWriteResolution(uint8_t bits) override;
170
175 operator bool() { return is_open && ftdi_context != nullptr; }
176
184 void getPWMStatistics(pin_size_t pin, uint64_t& cycles,
185 uint64_t& max_jitter_us, uint64_t& avg_jitter_us);
186
187 protected:
188 struct ftdi_context* ftdi_context = nullptr;
189 bool is_open = false;
190
191 // Pin state tracking
192 uint8_t pin_directions_a = 0x00; // Channel A direction mask (1=output, 0=input)
193 uint8_t pin_values_a = 0x00; // Channel A output values
194 uint8_t pin_directions_b = 0x00; // Channel B direction mask
195 uint8_t pin_values_b = 0x00; // Channel B output values
196
197 // Pin mode tracking
198 std::map<pin_size_t, PinMode> pin_modes;
199
200 // PWM state tracking
201 struct PWMPin {
202 bool enabled = false;
203 uint8_t duty_cycle = 0; // 0-255
204 uint32_t frequency = 1000; // Hz
205 uint32_t period_us = 1000; // Period in microseconds
206 uint32_t on_time_us = 0; // On time in microseconds
207 std::chrono::high_resolution_clock::time_point period_start; // Start of current period
208 bool current_state = false;
209 uint64_t cycle_count = 0; // Total cycles for drift correction
210 // Statistics for monitoring
211 uint64_t max_jitter_us = 0;
212 uint64_t total_jitter_us = 0;
213 };
214
215 std::map<pin_size_t, PWMPin> pwm_pins;
216 std::thread pwm_thread;
217 std::atomic<bool> pwm_thread_running{false};
218 std::mutex pwm_mutex;
219
225 bool updateGPIOState(int channel);
226
234
240 int getChannel(pin_size_t pin) { return (pin >= 8) ? 1 : 0; }
241
247 int getBitPosition(pin_size_t pin) { return pin % 8; }
248
252 void pwmThreadFunction();
253
257 void startPWMThread();
258
262 void stopPWMThread();
263
270 void updatePWMPin(pin_size_t pin, uint8_t duty_cycle, uint32_t frequency = 1000);
271};
272
273} // namespace arduino
274
275#endif // USE_FTDI
Definition DMAPool.h:103
GPIO hardware abstraction for FTDI FT2232HL in the Arduino emulator.
Definition HardwareGPIO_FTDI.h:53
void noTone(uint8_t _pin) override
Stop tone generation on a pin (not supported by FT2232HL).
Definition HardwareGPIO_FTDI.cpp:292
void getPWMStatistics(pin_size_t pin, uint64_t &cycles, uint64_t &max_jitter_us, uint64_t &avg_jitter_us)
Get PWM statistics for monitoring timing accuracy.
Definition HardwareGPIO_FTDI.cpp:550
PinStatus digitalRead(pin_size_t pinNumber) override
Read a digital value from a GPIO pin.
Definition HardwareGPIO_FTDI.cpp:175
HardwareGPIO_FTDI()=default
Constructor for HardwareGPIO_FTDI.
int getBitPosition(pin_size_t pin)
Get the bit position within a channel for a given pin.
Definition HardwareGPIO_FTDI.h:247
~HardwareGPIO_FTDI()
Destructor for HardwareGPIO_FTDI.
Definition HardwareGPIO_FTDI.cpp:25
void analogWriteResolution(uint8_t bits) override
Set the resolution for analogWrite() operations.
Definition HardwareGPIO_FTDI.cpp:565
void stopPWMThread()
Stop the PWM background thread.
Definition HardwareGPIO_FTDI.cpp:522
int analogRead(pin_size_t pinNumber) override
Read an analog value from a pin (not supported by FT2232HL).
Definition HardwareGPIO_FTDI.cpp:192
void analogReference(uint8_t mode) override
Set the analog reference mode (not supported by FT2232HL).
Definition HardwareGPIO_FTDI.cpp:197
void pwmThreadFunction()
PWM thread function that handles software PWM generation.
Definition HardwareGPIO_FTDI.cpp:386
bool begin(int vendor_id=0x0403, int product_id=0x6010, const char *description=nullptr, const char *serial=nullptr)
Initialize the GPIO hardware interface for FTDI FT2232HL.
Definition HardwareGPIO_FTDI.cpp:29
void end()
Close the FTDI connection and cleanup resources.
Definition HardwareGPIO_FTDI.cpp:97
bool updateGPIOState(int channel)
Update the GPIO state on the FTDI device.
Definition HardwareGPIO_FTDI.cpp:306
unsigned long pulseInLong(uint8_t pin, uint8_t state, unsigned long timeout=1000000L) override
Measure long pulse duration on a pin (not supported by FT2232HL).
Definition HardwareGPIO_FTDI.cpp:301
void updatePWMPin(pin_size_t pin, uint8_t duty_cycle, uint32_t frequency=1000)
Update PWM pin configuration.
Definition HardwareGPIO_FTDI.cpp:532
void analogWrite(pin_size_t pinNumber, int value) override
Write an analog value (PWM) to a pin using software PWM.
Definition HardwareGPIO_FTDI.cpp:201
int getChannel(pin_size_t pin)
Get the channel number for a given pin.
Definition HardwareGPIO_FTDI.h:240
void digitalWrite(pin_size_t pinNumber, PinStatus status) override
Write a digital value to a GPIO pin.
Definition HardwareGPIO_FTDI.cpp:140
void analogWriteFrequency(pin_size_t pinNumber, uint32_t frequency)
Set the PWM frequency for analogWrite() on a specific pin.
Definition HardwareGPIO_FTDI.cpp:252
bool readGPIOState(int channel, uint8_t &value)
Read current GPIO state from the FTDI device.
Definition HardwareGPIO_FTDI.cpp:353
void pinMode(pin_size_t pinNumber, PinMode pinMode) override
Set the mode of a GPIO pin (INPUT, OUTPUT, etc).
Definition HardwareGPIO_FTDI.cpp:111
void tone(uint8_t _pin, unsigned int frequency, unsigned long duration=0) override
Generate a tone on a pin (not supported by FT2232HL).
Definition HardwareGPIO_FTDI.cpp:288
unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout=1000000L) override
Measure pulse duration on a pin (not supported by FT2232HL).
Definition HardwareGPIO_FTDI.cpp:296
void startPWMThread()
Start the PWM background thread.
Definition HardwareGPIO_FTDI.cpp:501
Abstract base class for GPIO (General Purpose Input/Output) functions.
Definition HardwareGPIO.h:51
We provide the WiFi class to simulate the Arduino WIFI. In in Linux we can expect that networking is ...
Definition CanMsg.cpp:31
Definition HardwareGPIO_FTDI.h:201