Skip to content

Commit 5f90c14

Browse files
committed
Virtual pins handlers
arduino#1 defining alternative pin handling functions and respective triggers installed into pin functions all changes wraped by #defines alternative handlers require compilation with VIRTUAL_PINS defined digital pin functions triggers require both VIRTUAL_PINS and VPINS_TRIGGER defined eventually we can extend pin tables instead of installing the triggers
1 parent 3f63f29 commit 5f90c14

File tree

2 files changed

+37
-11
lines changed

2 files changed

+37
-11
lines changed

Diff for: cores/arduino/Arduino.h

+10-2
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ void yield(void);
7373
#define INTERNAL INTERNAL1V1
7474
#define INTERNAL2V56 9
7575
#define INTERNAL2V56_EXTCAP 13
76-
#else
76+
#else
7777
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega644__) || defined(__AVR_ATmega644A__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__)
7878
#define INTERNAL1V1 2
7979
#define INTERNAL2V56 3
@@ -171,7 +171,7 @@ extern const uint8_t PROGMEM digital_pin_to_timer_PGM[];
171171

172172
// Get the bit location within the hardware port of the given virtual pin.
173173
// This comes from the pins_*.c file for the active board configuration.
174-
//
174+
//
175175
// These perform slightly better as macros compared to inline functions
176176
//
177177
#define digitalPinToPort(P) ( pgm_read_byte( digital_pin_to_port_PGM + (P) ) )
@@ -256,4 +256,12 @@ long map(long, long, long, long, long);
256256

257257
#include "pins_arduino.h"
258258

259+
// #define VIRTUAL_PINS
260+
// #define VPINS_TRIGGER
261+
#if defined(VIRTUAL_PINS)
262+
extern void (*virtual_pinMode_handler)(uint8_t pin, uint8_t mode);
263+
extern void (*virtual_digitalWrite_handler)(uint8_t pin, uint8_t val);
264+
extern int (*virtual_digitalRead_handler)(uint8_t pin);
265+
#endif
266+
259267
#endif

Diff for: cores/arduino/wiring_digital.c

+27-9
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@
2828

2929
void pinMode(uint8_t pin, uint8_t mode)
3030
{
31+
#if defined(VIRTUAL_PINS) && defined(VPINS_TRIGGER)
32+
if (pin>=NUM_DIGITAL_PINS) return (*virtual_pinMode_handler)(pin,mode);
33+
#endif
34+
3135
uint8_t bit = digitalPinToBitMask(pin);
3236
uint8_t port = digitalPinToPort(pin);
3337
volatile uint8_t *reg, *out;
@@ -38,7 +42,7 @@ void pinMode(uint8_t pin, uint8_t mode)
3842
reg = portModeRegister(port);
3943
out = portOutputRegister(port);
4044

41-
if (mode == INPUT) {
45+
if (mode == INPUT) {
4246
uint8_t oldSREG = SREG;
4347
cli();
4448
*reg &= ~bit;
@@ -85,15 +89,15 @@ static void turnOffPWM(uint8_t timer)
8589
#if defined(TCCR1A) && defined(COM1C1)
8690
case TIMER1C: cbi(TCCR1A, COM1C1); break;
8791
#endif
88-
92+
8993
#if defined(TCCR2) && defined(COM21)
9094
case TIMER2: cbi(TCCR2, COM21); break;
9195
#endif
92-
96+
9397
#if defined(TCCR0A) && defined(COM0A1)
9498
case TIMER0A: cbi(TCCR0A, COM0A1); break;
9599
#endif
96-
100+
97101
#if defined(TCCR0A) && defined(COM0B1)
98102
case TIMER0B: cbi(TCCR0A, COM0B1); break;
99103
#endif
@@ -103,7 +107,7 @@ static void turnOffPWM(uint8_t timer)
103107
#if defined(TCCR2A) && defined(COM2B1)
104108
case TIMER2B: cbi(TCCR2A, COM2B1); break;
105109
#endif
106-
110+
107111
#if defined(TCCR3A) && defined(COM3A1)
108112
case TIMER3A: cbi(TCCR3A, COM3A1); break;
109113
#endif
@@ -116,17 +120,17 @@ static void turnOffPWM(uint8_t timer)
116120

117121
#if defined(TCCR4A) && defined(COM4A1)
118122
case TIMER4A: cbi(TCCR4A, COM4A1); break;
119-
#endif
123+
#endif
120124
#if defined(TCCR4A) && defined(COM4B1)
121125
case TIMER4B: cbi(TCCR4A, COM4B1); break;
122126
#endif
123127
#if defined(TCCR4A) && defined(COM4C1)
124128
case TIMER4C: cbi(TCCR4A, COM4C1); break;
125-
#endif
129+
#endif
126130
#if defined(TCCR4C) && defined(COM4D1)
127131
case TIMER4D: cbi(TCCR4C, COM4D1); break;
128-
#endif
129-
132+
#endif
133+
130134
#if defined(TCCR5A)
131135
case TIMER5A: cbi(TCCR5A, COM5A1); break;
132136
case TIMER5B: cbi(TCCR5A, COM5B1); break;
@@ -137,6 +141,9 @@ static void turnOffPWM(uint8_t timer)
137141

138142
void digitalWrite(uint8_t pin, uint8_t val)
139143
{
144+
#if defined(VIRTUAL_PINS) && defined(VPINS_TRIGGER)
145+
if (pin>=NUM_DIGITAL_PINS) return (*virtual_digitalWrite_handler)(pin,val);
146+
#endif
140147
uint8_t timer = digitalPinToTimer(pin);
141148
uint8_t bit = digitalPinToBitMask(pin);
142149
uint8_t port = digitalPinToPort(pin);
@@ -164,6 +171,9 @@ void digitalWrite(uint8_t pin, uint8_t val)
164171

165172
int digitalRead(uint8_t pin)
166173
{
174+
#if defined(VIRTUAL_PINS) && defined(VPINS_TRIGGER)
175+
if (pin>=NUM_DIGITAL_PINS) return (*virtual_digitalRead_handler)(pin);
176+
#endif
167177
uint8_t timer = digitalPinToTimer(pin);
168178
uint8_t bit = digitalPinToBitMask(pin);
169179
uint8_t port = digitalPinToPort(pin);
@@ -177,3 +187,11 @@ int digitalRead(uint8_t pin)
177187
if (*portInputRegister(port) & bit) return HIGH;
178188
return LOW;
179189
}
190+
191+
#if defined(VIRTUAL_PINS)
192+
void virtual_defaultHandler(uint8_t pin, uint8_t val) {}
193+
int virtual_defaultRead_handler(uint8_t pin) {return LOW;}
194+
void (*virtual_pinMode_handler)(uint8_t pin, uint8_t mode)=virtual_defaultHandler;
195+
void (*virtual_digitalWrite_handler)(uint8_t pin, uint8_t val)=virtual_defaultHandler;
196+
int (*virtual_digitalRead_handler)(uint8_t pin)=virtual_defaultRead_handler;
197+
#endif

0 commit comments

Comments
 (0)