|
@@ -26,6 +26,24 @@
|
26
|
26
|
|
27
|
27
|
#define RETRANSMIT_TIME 200
|
28
|
28
|
|
|
29
|
+#define PKT_TYPE_PLAYER 0x00
|
|
30
|
+#define PKT_TYPE_SHOT 0x01
|
|
31
|
+
|
|
32
|
+struct mp_header {
|
|
33
|
+ uint8_t type;
|
|
34
|
+};
|
|
35
|
+
|
|
36
|
+struct mp_packet {
|
|
37
|
+ struct mp_header header;
|
|
38
|
+ union {
|
|
39
|
+ struct mp_player_state player;
|
|
40
|
+ struct mp_shot_state shot;
|
|
41
|
+ } data;
|
|
42
|
+};
|
|
43
|
+
|
|
44
|
+#define PKT_SIZE_PLAYER (sizeof(struct mp_player_state) + sizeof(struct mp_header))
|
|
45
|
+#define PKT_SIZE_SHOT (sizeof(struct mp_shot_state) + sizeof(struct mp_header))
|
|
46
|
+
|
29
|
47
|
enum mp_state {
|
30
|
48
|
MP_M_SEND = 0,
|
31
|
49
|
MP_M_WAIT = 1,
|
|
@@ -40,23 +58,49 @@ static enum mp_state state = 0;
|
40
|
58
|
static uint16_t next_t = 0;
|
41
|
59
|
static uint8_t our_turn = 0;
|
42
|
60
|
|
|
61
|
+static uint8_t *data = NULL;
|
|
62
|
+static uint8_t remaining = 0;
|
|
63
|
+
|
|
64
|
+static uint8_t rx_buff[sizeof(struct mp_packet)] = {0};
|
|
65
|
+static uint8_t rx_len = 0;
|
|
66
|
+
|
43
|
67
|
uint8_t mp_connection_status = 0;
|
44
|
68
|
|
|
69
|
+static inline void Tx(uint8_t x) {
|
|
70
|
+ SB_REG = x;
|
|
71
|
+ SC_REG = SIOF_XFER_START | SIOF_CLOCK_INT;
|
|
72
|
+}
|
|
73
|
+
|
|
74
|
+static inline void Rx(uint8_t x) {
|
|
75
|
+ SB_REG = x;
|
|
76
|
+ SC_REG = SIOF_XFER_START | SIOF_CLOCK_EXT;
|
|
77
|
+}
|
|
78
|
+
|
|
79
|
+static inline void tx_rx(uint8_t x) {
|
|
80
|
+ our_turn ? Tx(x) : Rx(x);
|
|
81
|
+}
|
|
82
|
+
|
|
83
|
+static inline void transmit(struct mp_packet *pkt) {
|
|
84
|
+
|
|
85
|
+}
|
|
86
|
+
|
|
87
|
+static inline uint8_t transmitting(void) {
|
|
88
|
+ return SC_REG & SIOF_XFER_START;
|
|
89
|
+}
|
|
90
|
+
|
45
|
91
|
uint8_t mp_master_ready(void) BANKED {
|
46
|
92
|
switch (state) {
|
47
|
93
|
case MP_M_SEND:
|
48
|
|
- SB_REG = MASTER_HELLO;
|
49
|
|
- SC_REG = SIOF_XFER_START | SIOF_CLOCK_INT;
|
|
94
|
+ Tx(MASTER_HELLO);
|
50
|
95
|
next_t = timer_get() + RETRANSMIT_TIME;
|
51
|
96
|
mp_connection_status++;
|
52
|
97
|
state = MP_M_WAIT;
|
53
|
98
|
break;
|
54
|
99
|
|
55
|
100
|
case MP_M_WAIT:
|
56
|
|
- if (!(SC_REG & SIOF_XFER_START)) {
|
|
101
|
+ if (!transmitting()) {
|
57
|
102
|
if (SB_REG == SLAVE_HELLO) {
|
58
|
|
- SB_REG = SLAVE_HELLO;
|
59
|
|
- SC_REG = SIOF_XFER_START | SIOF_CLOCK_EXT;
|
|
103
|
+ Rx(SLAVE_HELLO);
|
60
|
104
|
next_t = timer_get() + RETRANSMIT_TIME;
|
61
|
105
|
mp_connection_status++;
|
62
|
106
|
state = MP_M_REPLY;
|
|
@@ -68,7 +112,7 @@ uint8_t mp_master_ready(void) BANKED {
|
68
|
112
|
break;
|
69
|
113
|
|
70
|
114
|
case MP_M_REPLY:
|
71
|
|
- if (!(SC_REG & SIOF_XFER_START)) {
|
|
115
|
+ if (!transmitting()) {
|
72
|
116
|
if (SB_REG == MASTER_HELLO) {
|
73
|
117
|
return 1;
|
74
|
118
|
} else {
|
|
@@ -90,25 +134,27 @@ uint8_t mp_master_ready(void) BANKED {
|
90
|
134
|
|
91
|
135
|
void mp_master_start(void) BANKED {
|
92
|
136
|
our_turn = 1;
|
|
137
|
+ remaining = 0;
|
|
138
|
+ next_t = timer_get() + RETRANSMIT_TIME;
|
|
139
|
+
|
93
|
140
|
game(GM_MULTI);
|
|
141
|
+
|
94
|
142
|
state = 0;
|
95
|
143
|
}
|
96
|
144
|
|
97
|
145
|
uint8_t mp_slave_ready(void) BANKED {
|
98
|
146
|
switch (state) {
|
99
|
147
|
case MP_S_START:
|
100
|
|
- SB_REG = SLAVE_HELLO;
|
101
|
|
- SC_REG = SIOF_XFER_START | SIOF_CLOCK_EXT;
|
|
148
|
+ Rx(SLAVE_HELLO);
|
102
|
149
|
next_t = timer_get() + RETRANSMIT_TIME;
|
103
|
150
|
mp_connection_status++;
|
104
|
151
|
state = MP_S_WAIT;
|
105
|
152
|
break;
|
106
|
153
|
|
107
|
154
|
case MP_S_WAIT:
|
108
|
|
- if (!(SC_REG & SIOF_XFER_START)) {
|
|
155
|
+ if (!transmitting()) {
|
109
|
156
|
if (SB_REG == MASTER_HELLO) {
|
110
|
|
- SB_REG = MASTER_HELLO;
|
111
|
|
- SC_REG = SIOF_XFER_START | SIOF_CLOCK_INT;
|
|
157
|
+ Tx(MASTER_HELLO);
|
112
|
158
|
next_t = timer_get() + RETRANSMIT_TIME;
|
113
|
159
|
mp_connection_status++;
|
114
|
160
|
state = MP_S_REPLY;
|
|
@@ -122,7 +168,7 @@ uint8_t mp_slave_ready(void) BANKED {
|
122
|
168
|
break;
|
123
|
169
|
|
124
|
170
|
case MP_S_REPLY:
|
125
|
|
- if (!(SC_REG & SIOF_XFER_START)) {
|
|
171
|
+ if (!transmitting()) {
|
126
|
172
|
if (SB_REG == SLAVE_HELLO) {
|
127
|
173
|
return 1;
|
128
|
174
|
}
|
|
@@ -142,10 +188,36 @@ uint8_t mp_slave_ready(void) BANKED {
|
142
|
188
|
|
143
|
189
|
void mp_slave_start(void) BANKED {
|
144
|
190
|
our_turn = 0;
|
|
191
|
+ remaining = 0;
|
|
192
|
+ next_t = timer_get() + RETRANSMIT_TIME;
|
|
193
|
+
|
145
|
194
|
game(GM_MULTI);
|
|
195
|
+
|
146
|
196
|
state = 0;
|
147
|
197
|
}
|
148
|
198
|
|
149
|
|
-void mp_handle(void) BANKED {
|
|
199
|
+uint8_t mp_handle(void) BANKED {
|
|
200
|
+ if ((our_turn) && (timer_get() >= next_t) && data && (remaining > 0)) {
|
|
201
|
+ if (rx_len < sizeof(struct mp_packet)) {
|
|
202
|
+ rx_buff[rx_len++] = SB_REG;
|
|
203
|
+ }
|
|
204
|
+ tx_rx(*(data++));
|
|
205
|
+ remaining--;
|
|
206
|
+ } else if ((!our_turn) && (!transmitting()) && data && (remaining > 0)) {
|
|
207
|
+ if (rx_len < sizeof(struct mp_packet)) {
|
|
208
|
+ rx_buff[rx_len++] = SB_REG;
|
|
209
|
+ }
|
|
210
|
+ tx_rx(*(data++));
|
|
211
|
+ remaining--;
|
|
212
|
+ }
|
|
213
|
+
|
|
214
|
+ return our_turn && (remaining == 0);
|
|
215
|
+}
|
|
216
|
+
|
|
217
|
+void mp_new_state(struct mp_player_state *state) BANKED {
|
|
218
|
+ // TODO
|
|
219
|
+}
|
150
|
220
|
|
|
221
|
+void mp_add_shot(struct mp_shot_state *state) BANKED {
|
|
222
|
+ // TODO
|
151
|
223
|
}
|