28
28
29
29
void pinMode (uint8_t pin , uint8_t mode )
30
30
{
31
+ #if defined(VIRTUAL_PINS ) && defined(VPINS_TRIGGER )
32
+ if (pin >=NUM_DIGITAL_PINS ) return (* virtual_pinMode_handler )(pin ,mode );
33
+ #endif
34
+
31
35
uint8_t bit = digitalPinToBitMask (pin );
32
36
uint8_t port = digitalPinToPort (pin );
33
37
volatile uint8_t * reg , * out ;
@@ -38,7 +42,7 @@ void pinMode(uint8_t pin, uint8_t mode)
38
42
reg = portModeRegister (port );
39
43
out = portOutputRegister (port );
40
44
41
- if (mode == INPUT ) {
45
+ if (mode == INPUT ) {
42
46
uint8_t oldSREG = SREG ;
43
47
cli ();
44
48
* reg &= ~bit ;
@@ -85,15 +89,15 @@ static void turnOffPWM(uint8_t timer)
85
89
#if defined(TCCR1A ) && defined(COM1C1 )
86
90
case TIMER1C : cbi (TCCR1A , COM1C1 ); break ;
87
91
#endif
88
-
92
+
89
93
#if defined(TCCR2 ) && defined(COM21 )
90
94
case TIMER2 : cbi (TCCR2 , COM21 ); break ;
91
95
#endif
92
-
96
+
93
97
#if defined(TCCR0A ) && defined(COM0A1 )
94
98
case TIMER0A : cbi (TCCR0A , COM0A1 ); break ;
95
99
#endif
96
-
100
+
97
101
#if defined(TCCR0A ) && defined(COM0B1 )
98
102
case TIMER0B : cbi (TCCR0A , COM0B1 ); break ;
99
103
#endif
@@ -103,7 +107,7 @@ static void turnOffPWM(uint8_t timer)
103
107
#if defined(TCCR2A ) && defined(COM2B1 )
104
108
case TIMER2B : cbi (TCCR2A , COM2B1 ); break ;
105
109
#endif
106
-
110
+
107
111
#if defined(TCCR3A ) && defined(COM3A1 )
108
112
case TIMER3A : cbi (TCCR3A , COM3A1 ); break ;
109
113
#endif
@@ -116,17 +120,17 @@ static void turnOffPWM(uint8_t timer)
116
120
117
121
#if defined(TCCR4A ) && defined(COM4A1 )
118
122
case TIMER4A : cbi (TCCR4A , COM4A1 ); break ;
119
- #endif
123
+ #endif
120
124
#if defined(TCCR4A ) && defined(COM4B1 )
121
125
case TIMER4B : cbi (TCCR4A , COM4B1 ); break ;
122
126
#endif
123
127
#if defined(TCCR4A ) && defined(COM4C1 )
124
128
case TIMER4C : cbi (TCCR4A , COM4C1 ); break ;
125
- #endif
129
+ #endif
126
130
#if defined(TCCR4C ) && defined(COM4D1 )
127
131
case TIMER4D : cbi (TCCR4C , COM4D1 ); break ;
128
- #endif
129
-
132
+ #endif
133
+
130
134
#if defined(TCCR5A )
131
135
case TIMER5A : cbi (TCCR5A , COM5A1 ); break ;
132
136
case TIMER5B : cbi (TCCR5A , COM5B1 ); break ;
@@ -137,6 +141,9 @@ static void turnOffPWM(uint8_t timer)
137
141
138
142
void digitalWrite (uint8_t pin , uint8_t val )
139
143
{
144
+ #if defined(VIRTUAL_PINS ) && defined(VPINS_TRIGGER )
145
+ if (pin >=NUM_DIGITAL_PINS ) return (* virtual_digitalWrite_handler )(pin ,val );
146
+ #endif
140
147
uint8_t timer = digitalPinToTimer (pin );
141
148
uint8_t bit = digitalPinToBitMask (pin );
142
149
uint8_t port = digitalPinToPort (pin );
@@ -164,6 +171,9 @@ void digitalWrite(uint8_t pin, uint8_t val)
164
171
165
172
int digitalRead (uint8_t pin )
166
173
{
174
+ #if defined(VIRTUAL_PINS ) && defined(VPINS_TRIGGER )
175
+ if (pin >=NUM_DIGITAL_PINS ) return (* virtual_digitalRead_handler )(pin );
176
+ #endif
167
177
uint8_t timer = digitalPinToTimer (pin );
168
178
uint8_t bit = digitalPinToBitMask (pin );
169
179
uint8_t port = digitalPinToPort (pin );
@@ -177,3 +187,11 @@ int digitalRead(uint8_t pin)
177
187
if (* portInputRegister (port ) & bit ) return HIGH ;
178
188
return LOW ;
179
189
}
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