Последняя активность 1 month ago

SNESONARDO

racerxdl's Avatar Lucas Teske ревизий этого фрагмента 9 years ago. К ревизии

1 file changed, 208 insertions

snesonardo.ino(файл создан)

@@ -0,0 +1,208 @@
1 + #include <Joystick.h>
2 +
3 + // Microseconds
4 + #define LATCH_TIME 12
5 + #define MEASURE_DELAY 6
6 +
7 + // Leonardo Pins
8 + #define CLOCK 2
9 + #define LATCH 3
10 + #define P1_DATA 4
11 + #define P2_DATA 5
12 +
13 + // Machine States
14 + #define STATE_LATCH 0
15 + #define STATE_WAIT_LATCH 1
16 + #define STATE_WAIT_MEASURE 2
17 + #define STATE_MEASURE_RISE 3
18 + #define STATE_MEASURE_FALL 4
19 + #define STATE_WAIT_LATCH 5
20 +
21 + // SNES Map
22 + #define BUTTON_A 8
23 + #define BUTTON_B 0
24 + #define BUTTON_X 9
25 + #define BUTTON_Y 1
26 + #define BUTTON_START 3
27 + #define BUTTON_SELECT 2
28 + #define BUTTON_L 10
29 + #define BUTTON_R 11
30 + #define BUTTON_UP 4
31 + #define BUTTON_DOWN 5
32 + #define BUTTON_LEFT 6
33 + #define BUTTON_RIGHT 7
34 +
35 + unsigned long t0, t1, t2;
36 +
37 + bool P1[16], P2[16];
38 +
39 + int state;
40 + int curPin;
41 +
42 + Joystick_ Joy1(0x03, JOYSTICK_TYPE_GAMEPAD,
43 + 8, 0, // Button Count, Hat Switch Count
44 + true, true, false, // X and Y, but no Z Axis
45 + false, false, false, // No Rx, Ry, or Rz
46 + false, false, // No rudder or throttle
47 + false, false, false); // No accelerator, brake, or steering
48 +
49 + Joystick_ Joy2(0x04, JOYSTICK_TYPE_GAMEPAD,
50 + 8, 0, // Button Count, Hat Switch Count
51 + true, true, false, // X and Y, but no Z Axis
52 + false, false, false, // No Rx, Ry, or Rz
53 + false, false, // No rudder or throttle
54 + false, false, false); // No accelerator, brake, or steering
55 +
56 + void setup() {
57 + pinMode(CLOCK, OUTPUT);
58 + pinMode(LATCH, OUTPUT);
59 + pinMode(P1_DATA, INPUT);
60 + pinMode(P2_DATA, INPUT);
61 +
62 + for (int i=0; i<10; i++) {
63 + P1[i] = false;
64 + P2[i] = false;
65 + }
66 +
67 + digitalWrite(CLOCK, HIGH);
68 + digitalWrite(LATCH, LOW);
69 + digitalWrite(P1_DATA, HIGH);
70 + digitalWrite(P2_DATA, HIGH);
71 +
72 + state = STATE_LATCH;
73 + curPin = 0;
74 +
75 + Joy1.setXAxisRange(-1, 1);
76 + Joy1.setYAxisRange(-1, 1);
77 + Joy2.setXAxisRange(-1, 1);
78 + Joy2.setYAxisRange(-1, 1);
79 +
80 +
81 + Joy1.begin(false);
82 + Joy2.begin(false);
83 + }
84 +
85 + void updateJoys() {
86 + Joy1.setYAxis(0);
87 + Joy2.setYAxis(0);
88 + Joy1.setXAxis(0);
89 + Joy2.setXAxis(0);
90 +
91 + for (int i=0; i<12; i++) {
92 + switch (i) {
93 + case BUTTON_A:
94 + Joy1.setButton(0, P1[i]);
95 + Joy2.setButton(0, P2[i]);
96 + break;
97 + case BUTTON_B:
98 + Joy1.setButton(1, P1[i]);
99 + Joy2.setButton(1, P2[i]);
100 + break;
101 + case BUTTON_X:
102 + Joy1.setButton(2, P1[i]);
103 + Joy2.setButton(2, P2[i]);
104 + break;
105 + case BUTTON_Y:
106 + Joy1.setButton(3, P1[i]);
107 + Joy2.setButton(3, P2[i]);
108 + break;
109 + case BUTTON_START:
110 + Joy1.setButton(4, P1[i]);
111 + Joy2.setButton(4, P2[i]);
112 + break;
113 + case BUTTON_SELECT:
114 + Joy1.setButton(5, P1[i]);
115 + Joy2.setButton(5, P2[i]);
116 + break;
117 + case BUTTON_L:
118 + Joy1.setButton(6, P1[i]);
119 + Joy2.setButton(6, P2[i]);
120 + break;
121 + case BUTTON_R:
122 + Joy1.setButton(7, P1[i]);
123 + Joy2.setButton(7, P2[i]);
124 + break;
125 + case BUTTON_UP:
126 + if (P1[i]) {
127 + Joy1.setYAxis(-1);
128 + }
129 + if (P2[i]) {
130 + Joy2.setYAxis(-1);
131 + }
132 + break;
133 + case BUTTON_DOWN:
134 + if (P1[i]) {
135 + Joy1.setYAxis(1);
136 + }
137 + if (P2[i]) {
138 + Joy2.setYAxis(1);
139 + }
140 + break;
141 + case BUTTON_LEFT:
142 + if (P1[i]) {
143 + Joy1.setXAxis(-1);
144 + }
145 + if (P2[i]) {
146 + Joy2.setXAxis(-1);
147 + }
148 + break;
149 + case BUTTON_RIGHT:
150 + if (P1[i]) {
151 + Joy1.setXAxis(1);
152 + }
153 + if (P2[i]) {
154 + Joy2.setXAxis(1);
155 + }
156 + break;
157 + }
158 + }
159 + Joy1.sendState();
160 + Joy2.sendState();
161 + }
162 +
163 + void loop() {
164 + switch(state) {
165 + case STATE_LATCH:
166 + digitalWrite(LATCH, HIGH);
167 + t0 = micros();
168 + state = STATE_WAIT_LATCH;
169 + break;
170 + case STATE_WAIT_LATCH:
171 + if (micros() - t0 >= LATCH_TIME) {
172 + digitalWrite(LATCH, LOW);
173 + t0 = micros();
174 + state = STATE_WAIT_MEASURE;
175 + }
176 + break;
177 + case STATE_WAIT_MEASURE:
178 + if(micros() - t0 >= MEASURE_DELAY) {
179 + t0 = micros();
180 + state = STATE_MEASURE_FALL;
181 + digitalWrite(CLOCK, LOW);
182 + }
183 + break;
184 + case STATE_MEASURE_RISE:
185 + if (micros() - t0 >= MEASURE_DELAY) {
186 + if (curPin == 16) {
187 + state = STATE_LATCH;
188 + curPin = 0;
189 + updateJoys();
190 + } else {
191 + digitalWrite(CLOCK, LOW);
192 + t0 = micros();
193 + state = STATE_MEASURE_FALL;
194 + }
195 + }
196 + break;
197 + case STATE_MEASURE_FALL:
198 + if (micros() - t0 >= MEASURE_DELAY) {
199 + P1[curPin] = !digitalRead(P1_DATA);
200 + P2[curPin] = !digitalRead(P2_DATA);
201 + curPin++;
202 + digitalWrite(CLOCK, HIGH);
203 + t0 = micros();
204 + state = STATE_MEASURE_RISE;
205 + }
206 + break;
207 + }
208 + }
Новее Позже