Son aktivite 1 month ago

SNESONARDO

snesonardo.ino Ham
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
35unsigned long t0, t1, t2;
36
37bool P1[16], P2[16];
38
39int state;
40int curPin;
41
42Joystick_ 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
49Joystick_ 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
56void 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
85void 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
163void 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}