uC chip interface arduino  0.9.0
A interface for async and neuromrphic IC testing
Loading...
Searching...
No Matches
interface_pin.cpp
Go to the documentation of this file.
1/*
2 This file is part of the Firmware project to interface with small Async or Neuromorphic chips
3 Copyright (C) 2022-2023 Ole Richter - University of Groningen
4 Copyright (C) 2022 Benjamin Hucko
5
6 This program is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
10
11 This program 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
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <https://www.gnu.org/licenses/>.
18*/
19
20#include "interface_pin.h"
21
22
25
26bool reserve_input_pin(uint8_t id, uint8_t from_instruction) {
27 if (id >= NUMBER_OF_DIGITAL_PINS){
29 return false;
30 }
31 noInterrupts();
32 if (input_pin_active[id] || output_pin_active[id]) {
33 interrupts();
34 error_message(OUT_ERROR_PIN_ALREADY_INUSE,from_instruction,id);
35 return false;
36 }
37 else{
38 input_pin_active[id] = true;
39 }
40 interrupts();
41 return true;
42}
43
44bool reserve_output_pin(uint8_t id, uint8_t from_instruction) {
45 if (id >= NUMBER_OF_DIGITAL_PINS){
47 return false;
48 }
49 noInterrupts();
50 if (input_pin_active[id] || output_pin_active[id]) {
51 interrupts();
52 error_message(OUT_ERROR_PIN_ALREADY_INUSE,from_instruction,id);
53 return false;
54 }
55 else{
56 output_pin_active[id] = true;
57 }
58 interrupts();
59 return true;
60}
61
62void configure_pin(uint8_t instruction, uint8_t data){
63
64 switch (instruction){
65 case CONF_OUTPUT:
66 if (reserve_output_pin(data)){
67 pinMode(data, OUTPUT);
68 }
69 break;
70 case CONF_INPUT:
71 if (reserve_input_pin(data)){
72 pinMode(data, INPUT);
73 switch(data){
74 case 0: attachInterrupt(digitalPinToInterrupt(data), pin_ISR0, CHANGE); break;
75 case 1: attachInterrupt(digitalPinToInterrupt(data), pin_ISR1, CHANGE); break;
76 case 2: attachInterrupt(digitalPinToInterrupt(data), pin_ISR2, CHANGE); break;
77 case 3: attachInterrupt(digitalPinToInterrupt(data), pin_ISR3, CHANGE); break;
78 case 4: attachInterrupt(digitalPinToInterrupt(data), pin_ISR4, CHANGE); break;
79 case 5: attachInterrupt(digitalPinToInterrupt(data), pin_ISR5, CHANGE); break;
80 case 6: attachInterrupt(digitalPinToInterrupt(data), pin_ISR6, CHANGE); break;
81 case 7: attachInterrupt(digitalPinToInterrupt(data), pin_ISR7, CHANGE); break;
82 case 8: attachInterrupt(digitalPinToInterrupt(data), pin_ISR8, CHANGE); break;
83 case 9: attachInterrupt(digitalPinToInterrupt(data), pin_ISR9, CHANGE); break;
84 case 10: attachInterrupt(digitalPinToInterrupt(data), pin_ISR10, CHANGE); break;
85 case 11: attachInterrupt(digitalPinToInterrupt(data), pin_ISR11, CHANGE); break;
86 case 12: attachInterrupt(digitalPinToInterrupt(data), pin_ISR12, CHANGE); break;
87 case 13: attachInterrupt(digitalPinToInterrupt(data), pin_ISR13, CHANGE); break;
88 case 14: attachInterrupt(digitalPinToInterrupt(data), pin_ISR14, CHANGE); break;
89 case 15: attachInterrupt(digitalPinToInterrupt(data), pin_ISR15, CHANGE); break;
90 case 16: attachInterrupt(digitalPinToInterrupt(data), pin_ISR16, CHANGE); break;
91 case 17: attachInterrupt(digitalPinToInterrupt(data), pin_ISR17, CHANGE); break;
92 case 18: attachInterrupt(digitalPinToInterrupt(data), pin_ISR18, CHANGE); break;
93 case 19: attachInterrupt(digitalPinToInterrupt(data), pin_ISR19, CHANGE); break;
94 case 20: attachInterrupt(digitalPinToInterrupt(data), pin_ISR20, CHANGE); break;
95 case 21: attachInterrupt(digitalPinToInterrupt(data), pin_ISR21, CHANGE); break;
96 case 22: attachInterrupt(digitalPinToInterrupt(data), pin_ISR22, CHANGE); break;
97 case 23: attachInterrupt(digitalPinToInterrupt(data), pin_ISR23, CHANGE); break;
98 case 24: attachInterrupt(digitalPinToInterrupt(data), pin_ISR24, CHANGE); break;
99 case 25: attachInterrupt(digitalPinToInterrupt(data), pin_ISR25, CHANGE); break;
100 case 26: attachInterrupt(digitalPinToInterrupt(data), pin_ISR26, CHANGE); break;
101 case 27: attachInterrupt(digitalPinToInterrupt(data), pin_ISR27, CHANGE); break;
102 case 28: attachInterrupt(digitalPinToInterrupt(data), pin_ISR28, CHANGE); break;
103 case 29: attachInterrupt(digitalPinToInterrupt(data), pin_ISR29, CHANGE); break;
104 case 30: attachInterrupt(digitalPinToInterrupt(data), pin_ISR30, CHANGE); break;
105 case 31: attachInterrupt(digitalPinToInterrupt(data), pin_ISR31, CHANGE); break;
106 case 32: attachInterrupt(digitalPinToInterrupt(data), pin_ISR32, CHANGE); break;
107 case 33: attachInterrupt(digitalPinToInterrupt(data), pin_ISR33, CHANGE); break;
108 case 34: attachInterrupt(digitalPinToInterrupt(data), pin_ISR34, CHANGE); break;
109 case 35: attachInterrupt(digitalPinToInterrupt(data), pin_ISR35, CHANGE); break;
110 case 36: attachInterrupt(digitalPinToInterrupt(data), pin_ISR36, CHANGE); break;
111 case 37: attachInterrupt(digitalPinToInterrupt(data), pin_ISR37, CHANGE); break;
112 case 38: attachInterrupt(digitalPinToInterrupt(data), pin_ISR38, CHANGE); break;
113 case 39: attachInterrupt(digitalPinToInterrupt(data), pin_ISR39, CHANGE); break;
114 case 40: attachInterrupt(digitalPinToInterrupt(data), pin_ISR40, CHANGE); break;
115 case 41: attachInterrupt(digitalPinToInterrupt(data), pin_ISR41, CHANGE); break;
116 case 42: attachInterrupt(digitalPinToInterrupt(data), pin_ISR42, CHANGE); break;
117 case 43: attachInterrupt(digitalPinToInterrupt(data), pin_ISR43, CHANGE); break;
118 case 44: attachInterrupt(digitalPinToInterrupt(data), pin_ISR44, CHANGE); break;
119 case 45: attachInterrupt(digitalPinToInterrupt(data), pin_ISR45, CHANGE); break;
120 case 46: attachInterrupt(digitalPinToInterrupt(data), pin_ISR46, CHANGE); break;
121 case 47: attachInterrupt(digitalPinToInterrupt(data), pin_ISR47, CHANGE); break;
122 case 48: attachInterrupt(digitalPinToInterrupt(data), pin_ISR48, CHANGE); break;
123 case 49: attachInterrupt(digitalPinToInterrupt(data), pin_ISR49, CHANGE); break;
124 case 50: attachInterrupt(digitalPinToInterrupt(data), pin_ISR50, CHANGE); break;
125 case 51: attachInterrupt(digitalPinToInterrupt(data), pin_ISR51, CHANGE); break;
126 case 52: attachInterrupt(digitalPinToInterrupt(data), pin_ISR52, CHANGE); break;
127 case 53: attachInterrupt(digitalPinToInterrupt(data), pin_ISR53, CHANGE); break;
128 case 54: attachInterrupt(digitalPinToInterrupt(data), pin_ISR54, CHANGE); break;
129 default:
131 return;
132 }
133 }
134 break;
135 default:
137 return;
138 }
139 // send confirmation
140 send_config(IN_CONF_PIN,instruction,data);
141}
142
146void set_pin(uint8_t id, uint32_t data){
147 if (output_pin_active[id]){
148 if (data) {
149 digitalWrite(id, HIGH);
150 } else {
151 digitalWrite(id, LOW);
152 }
153 // send confirmation
154 send_pin(IN_PIN,id,data,true);
155 }
156 else{
158 }
159}
160
161void read_pin(uint8_t id){
162 if (output_pin_active[id] || input_pin_active[id]){
163 uint8_t data = digitalRead(id);
164 if (data) send_pin(OUT_PIN_HIGH, id, data);
165 else send_pin(OUT_PIN_LOW, id, data);
166 // send confirmation
167 send_pin(IN_PIN_READ,id,0,true);
168 }
169 else{
171 }
172}
173
174void debug_pin(uint8_t id, uint8_t value){
175 if (reserve_output_pin(id)){
176 pinMode(id, OUTPUT);
177 digitalWrite(id, value);
178 }
179}
180
181void pin_ISR(uint8_t id) {
182 #if defined(ARDUINO_TEENSY41)
183 uint8_t data = digitalReadFast(id);
184 #else
185 uint8_t data = digitalRead(id);
186 #endif
187 if (data) send_pin(OUT_PIN_HIGH, id, data);
188 else send_pin(OUT_PIN_LOW, id, data);
189}
190
191void pin_ISR0() { pin_ISR(0); }
192void pin_ISR1() { pin_ISR(1); }
193void pin_ISR2() { pin_ISR(2); }
194void pin_ISR3() { pin_ISR(3); }
195void pin_ISR4() { pin_ISR(4); }
196void pin_ISR5() { pin_ISR(5); }
197void pin_ISR6() { pin_ISR(6); }
198void pin_ISR7() { pin_ISR(7); }
199void pin_ISR8() { pin_ISR(8); }
200void pin_ISR9() { pin_ISR(9); }
201void pin_ISR10() { pin_ISR(10); }
202void pin_ISR11() { pin_ISR(11); }
203void pin_ISR12() { pin_ISR(12); }
204void pin_ISR13() { pin_ISR(13); }
205void pin_ISR14() { pin_ISR(14); }
206void pin_ISR15() { pin_ISR(15); }
207void pin_ISR16() { pin_ISR(16); }
208void pin_ISR17() { pin_ISR(17); }
209void pin_ISR18() { pin_ISR(18); }
210void pin_ISR19() { pin_ISR(19); }
211void pin_ISR20() { pin_ISR(20); }
212void pin_ISR21() { pin_ISR(21); }
213void pin_ISR22() { pin_ISR(22); }
214void pin_ISR23() { pin_ISR(23); }
215void pin_ISR24() { pin_ISR(24); }
216void pin_ISR25() { pin_ISR(25); }
217void pin_ISR26() { pin_ISR(26); }
218void pin_ISR27() { pin_ISR(27); }
219void pin_ISR28() { pin_ISR(28); }
220void pin_ISR29() { pin_ISR(29); }
221void pin_ISR30() { pin_ISR(30); }
222void pin_ISR31() { pin_ISR(31); }
223void pin_ISR32() { pin_ISR(32); }
224void pin_ISR33() { pin_ISR(33); }
225void pin_ISR34() { pin_ISR(34); }
226void pin_ISR35() { pin_ISR(35); }
227void pin_ISR36() { pin_ISR(36); }
228void pin_ISR37() { pin_ISR(37); }
229void pin_ISR38() { pin_ISR(38); }
230void pin_ISR39() { pin_ISR(39); }
231void pin_ISR40() { pin_ISR(40); }
232void pin_ISR41() { pin_ISR(41); }
233void pin_ISR42() { pin_ISR(42); }
234void pin_ISR43() { pin_ISR(43); }
235void pin_ISR44() { pin_ISR(44); }
236void pin_ISR45() { pin_ISR(45); }
237void pin_ISR46() { pin_ISR(46); }
238void pin_ISR47() { pin_ISR(47); }
239void pin_ISR48() { pin_ISR(48); }
240void pin_ISR49() { pin_ISR(49); }
241void pin_ISR50() { pin_ISR(50); }
242void pin_ISR51() { pin_ISR(51); }
243void pin_ISR52() { pin_ISR(52); }
244void pin_ISR53() { pin_ISR(53); }
245void pin_ISR54() { pin_ISR(54); }
void error_message(uint8_t error_header, uint8_t source_header, uint32_t value, uint8_t sub_source_header)
void send_pin(uint8_t header, uint8_t id, uint8_t value, bool is_confirmation)
void send_config(uint8_t header, uint8_t config_header, uint8_t value)
@ IN_PIN_READ
Definition: datatypes.h:89
@ IN_PIN
Definition: datatypes.h:82
@ IN_CONF_PIN
Definition: datatypes.h:192
@ CONF_INPUT
Definition: datatypes.h:631
@ CONF_OUTPUT
Definition: datatypes.h:624
@ OUT_ERROR_UNKNOWN_CONFIGURATION
Definition: datatypes.h:562
@ OUT_PIN_LOW
Definition: datatypes.h:410
@ OUT_ERROR_PIN_ALREADY_INUSE
Definition: datatypes.h:527
@ OUT_PIN_HIGH
Definition: datatypes.h:418
@ OUT_ERROR_PIN_NOT_CONFIGURED
Definition: datatypes.h:532
@ OUT_ERROR_CONFIGURATION_OUT_OF_BOUNDS
Definition: datatypes.h:579
bool reserve_output_pin(uint8_t id, uint8_t from_instruction)
void read_pin(uint8_t id)
void pin_ISR49()
void pin_ISR34()
void pin_ISR23()
void pin_ISR43()
void pin_ISR26()
void set_pin(uint8_t id, uint32_t data)
void pin_ISR44()
void pin_ISR35()
void pin_ISR24()
void pin_ISR10()
void configure_pin(uint8_t instruction, uint8_t data)
void pin_ISR17()
void pin_ISR52()
void pin_ISR39()
void pin_ISR33()
volatile bool output_pin_active[NUMBER_OF_DIGITAL_PINS]
void pin_ISR0()
void pin_ISR22()
void pin_ISR45()
void pin_ISR38()
void pin_ISR25()
void debug_pin(uint8_t id, uint8_t value)
void pin_ISR54()
void pin_ISR46()
void pin_ISR11()
void pin_ISR48()
void pin_ISR3()
void pin_ISR37()
void pin_ISR19()
void pin_ISR53()
void pin_ISR29()
void pin_ISR13()
void pin_ISR4()
void pin_ISR8()
void pin_ISR42()
void pin_ISR50()
void pin_ISR7()
void pin_ISR36()
void pin_ISR28()
void pin_ISR30()
void pin_ISR16()
void pin_ISR40()
void pin_ISR(uint8_t id)
void pin_ISR5()
void pin_ISR21()
void pin_ISR32()
void pin_ISR9()
void pin_ISR51()
void pin_ISR47()
void pin_ISR2()
void pin_ISR12()
void pin_ISR41()
volatile bool input_pin_active[NUMBER_OF_DIGITAL_PINS]
void pin_ISR31()
void pin_ISR18()
bool reserve_input_pin(uint8_t id, uint8_t from_instruction)
void pin_ISR15()
void pin_ISR1()
void pin_ISR14()
void pin_ISR20()
void pin_ISR27()
void pin_ISR6()
#define NUMBER_OF_DIGITAL_PINS
Definition: uc_boards.h:110