Skip to content

Commit 00a4db0

Browse files
committed
Add virtual pins
1 parent 3f63f29 commit 00a4db0

File tree

2 files changed

+30
-6
lines changed

2 files changed

+30
-6
lines changed

Diff for: cores/arduino/Arduino.h

+11-3
Original file line numberDiff line numberDiff line change
@@ -130,9 +130,9 @@ void initVariant(void);
130130

131131
int atexit(void (*func)()) __attribute__((weak));
132132

133-
void pinMode(uint8_t, uint8_t);
134-
void digitalWrite(uint8_t, uint8_t);
135-
int digitalRead(uint8_t);
133+
void pinMode(int8_t, uint8_t);
134+
void digitalWrite(int8_t, uint8_t);
135+
int digitalRead(int8_t);
136136
int analogRead(uint8_t);
137137
void analogReference(uint8_t mode);
138138
void analogWrite(uint8_t, int);
@@ -150,6 +150,14 @@ uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder);
150150
void attachInterrupt(uint8_t, void (*)(void), int mode);
151151
void detachInterrupt(uint8_t);
152152

153+
typedef struct {
154+
void (*pinMode)(uint8_t);
155+
void (*digitalWrite)(uint8_t);
156+
int (*digitalRead)(void);
157+
} VirtualPin;
158+
159+
void attachVirtualPin(int8_t, VirtualPin *);
160+
153161
void setup(void);
154162
void loop(void);
155163

Diff for: cores/arduino/wiring_digital.c

+19-3
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,20 @@
2626
#include "wiring_private.h"
2727
#include "pins_arduino.h"
2828

29-
void pinMode(uint8_t pin, uint8_t mode)
29+
#if !defined(NUM_VIRTUAL_PINS)
30+
#define NUM_VIRTUAL_PINS 1
31+
#endif
32+
33+
static VirtualPin *virtualPins[NUM_VIRTUAL_PINS];
34+
35+
void attachVirtualPin(int8_t pin, VirtualPin *virtual) {
36+
virtualPins[~pin] = virtual;
37+
}
38+
39+
void pinMode(int8_t pin, uint8_t mode)
3040
{
41+
if (pin < 0) return virtualPins[~pin]->pinMode(mode);
42+
3143
uint8_t bit = digitalPinToBitMask(pin);
3244
uint8_t port = digitalPinToPort(pin);
3345
volatile uint8_t *reg, *out;
@@ -135,8 +147,10 @@ static void turnOffPWM(uint8_t timer)
135147
}
136148
}
137149

138-
void digitalWrite(uint8_t pin, uint8_t val)
150+
void digitalWrite(int8_t pin, uint8_t val)
139151
{
152+
if (pin < 0) return virtualPins[~pin]->digitalWrite(val);
153+
140154
uint8_t timer = digitalPinToTimer(pin);
141155
uint8_t bit = digitalPinToBitMask(pin);
142156
uint8_t port = digitalPinToPort(pin);
@@ -162,8 +176,10 @@ void digitalWrite(uint8_t pin, uint8_t val)
162176
SREG = oldSREG;
163177
}
164178

165-
int digitalRead(uint8_t pin)
179+
int digitalRead(int8_t pin)
166180
{
181+
if (pin < 0) return virtualPins[~pin]->digitalRead();
182+
167183
uint8_t timer = digitalPinToTimer(pin);
168184
uint8_t bit = digitalPinToBitMask(pin);
169185
uint8_t port = digitalPinToPort(pin);

0 commit comments

Comments
 (0)