1 | /*
|
---|
2 | * Copyright (C) 2013-2014 by Embedded and Real-Time Systems Laboratory
|
---|
3 | * Graduate School of Information Science, Nagoya Univ., JAPAN
|
---|
4 | *
|
---|
5 | * $Id: rcb3.c 213 2014-09-02 11:48:58Z honda $
|
---|
6 | */
|
---|
7 |
|
---|
8 | #include "Os.h"
|
---|
9 | #include "rcb3.h"
|
---|
10 |
|
---|
11 | /*
|
---|
12 | * PS3Rg[Ì{^Ì
|
---|
13 | */
|
---|
14 | #define PS3_NUM_OF_BUTTON 14
|
---|
15 | #define PS3_NUM_OF_ANALOG 4
|
---|
16 |
|
---|
17 |
|
---|
18 | /*
|
---|
19 | * d¶tH[}bgÌ^Cv
|
---|
20 | */
|
---|
21 | enum rcb3_st {
|
---|
22 | RCB3_ST_HEADER_1,
|
---|
23 | RCB3_ST_BUTTON_1,
|
---|
24 | RCB3_ST_BUTTON_2,
|
---|
25 | RCB3_ST_ANALOG_1,
|
---|
26 | RCB3_ST_ANALOG_2,
|
---|
27 | RCB3_ST_ANALOG_3,
|
---|
28 | RCB3_ST_ANALOG_4,
|
---|
29 | RCB3_ST_SUM,
|
---|
30 | };
|
---|
31 |
|
---|
32 | /*
|
---|
33 | * óMbZ[WðÍpO[oÏ
|
---|
34 | */
|
---|
35 | static enum rcb3_st s_rcb3_st = RCB3_ST_HEADER_1;
|
---|
36 | static int s_rcb3_rmsg_cnt;
|
---|
37 | uint8 g_rcb3_rmsg[RCB3_MSG_LEN];
|
---|
38 |
|
---|
39 | /*
|
---|
40 | * {^bZ[W»ÊpO[oÏ
|
---|
41 | */
|
---|
42 | static const uint16 msg_button_pattern[PS3_NUM_OF_BUTTON] = {
|
---|
43 | RCB3_MSG_BUTTON_UP,
|
---|
44 | RCB3_MSG_BUTTON_DOWN,
|
---|
45 | RCB3_MSG_BUTTON_LEFT,
|
---|
46 | RCB3_MSG_BUTTON_RIGHT,
|
---|
47 | RCB3_MSG_BUTTON_TRIANGLE,
|
---|
48 | RCB3_MSG_BUTTON_CROSS,
|
---|
49 | RCB3_MSG_BUTTON_NOUGHT,
|
---|
50 | RCB3_MSG_BUTTON_SQUARE,
|
---|
51 | RCB3_MSG_BUTTON_L1,
|
---|
52 | RCB3_MSG_BUTTON_L2,
|
---|
53 | RCB3_MSG_BUTTON_R1,
|
---|
54 | RCB3_MSG_BUTTON_R2,
|
---|
55 | RCB3_MSG_BUTTON_START,
|
---|
56 | RCB3_MSG_BUTTON_SELECT
|
---|
57 | };
|
---|
58 |
|
---|
59 | /*
|
---|
60 | * {^óÔÛpO[oÏ
|
---|
61 | * _uobt@ƵÄOóÔÆ»ÝóÔðÛ¶·é
|
---|
62 | */
|
---|
63 | static boolean s_ps3button[2][PS3_NUM_OF_BUTTON];
|
---|
64 | static sint8 s_ps3analog[2][PS3_NUM_OF_ANALOG];
|
---|
65 |
|
---|
66 | /*
|
---|
67 | * OóÔÆ»ÝóÔð¦·|C^
|
---|
68 | */
|
---|
69 | boolean *p_g_pre_ps3button;
|
---|
70 | boolean *p_g_cur_ps3button;
|
---|
71 | sint8 *p_g_pre_ps3analog;
|
---|
72 | sint8 *p_g_cur_ps3analog;
|
---|
73 |
|
---|
74 |
|
---|
75 | void
|
---|
76 | rcb3_Init(void)
|
---|
77 | {
|
---|
78 | /* ToDo 0 clear */
|
---|
79 |
|
---|
80 | /* Init button */
|
---|
81 | p_g_pre_ps3button = s_ps3button[0];
|
---|
82 | p_g_cur_ps3button = s_ps3button[1];
|
---|
83 | p_g_pre_ps3analog = s_ps3analog[0];
|
---|
84 | p_g_cur_ps3analog = s_ps3analog[1];
|
---|
85 | }
|
---|
86 |
|
---|
87 | /*
|
---|
88 | * {^îñÍ2oCgÆÈÁÄ¢é½ß2oCgf[^ƵÄß·
|
---|
89 | */
|
---|
90 | static uint16
|
---|
91 | rcb3_GetReceivedButton()
|
---|
92 | {
|
---|
93 | uint16 button_cmd;
|
---|
94 |
|
---|
95 | button_cmd = (g_rcb3_rmsg[RCB3_MSG_OFFSET_BUTTON_H] << 8) | g_rcb3_rmsg[RCB3_MSG_OFFSET_BUTTON_L];
|
---|
96 |
|
---|
97 | return button_cmd;
|
---|
98 | }
|
---|
99 |
|
---|
100 | /*
|
---|
101 | * {^óÔÌXV
|
---|
102 | */
|
---|
103 | static void
|
---|
104 | rcb3_UpdateStatus(void)
|
---|
105 | {
|
---|
106 | boolean *tmp_button;
|
---|
107 | sint8 *tmp_analog;
|
---|
108 | int i;
|
---|
109 | uint16 button = rcb3_GetReceivedButton();
|
---|
110 |
|
---|
111 | /*
|
---|
112 | * OóÔÆ»ÝóÔÌ|C^ðXV
|
---|
113 | */
|
---|
114 | tmp_button = p_g_pre_ps3button;
|
---|
115 | tmp_analog = p_g_pre_ps3analog;
|
---|
116 |
|
---|
117 | p_g_pre_ps3button = p_g_cur_ps3button;
|
---|
118 | p_g_pre_ps3analog = p_g_cur_ps3analog;
|
---|
119 |
|
---|
120 | p_g_cur_ps3button = tmp_button;
|
---|
121 | p_g_cur_ps3analog = tmp_analog;
|
---|
122 |
|
---|
123 | /*
|
---|
124 | * »ÝÌfW^{^ÌóÔðXV
|
---|
125 | */
|
---|
126 | for(i = 0; i < PS3_NUM_OF_BUTTON; i++) {
|
---|
127 | if ((button & msg_button_pattern[i])) {
|
---|
128 | p_g_cur_ps3button[i] = TRUE;
|
---|
129 | }
|
---|
130 | else {
|
---|
131 | p_g_cur_ps3button[i] = FALSE;
|
---|
132 | }
|
---|
133 | }
|
---|
134 |
|
---|
135 | /*
|
---|
136 | * »ÝÌAiO{^ÌóÔðXV
|
---|
137 | */
|
---|
138 | for(i = 0; i < PS3_NUM_OF_ANALOG; i++) {
|
---|
139 | uint8 val = g_rcb3_rmsg[RCB3_MSG_OFFSET_L_ANALOG_LR + i];
|
---|
140 | p_g_cur_ps3analog[i] = ((sint8)val - RCB3_MSG_ANALOG_NEUTRAL);
|
---|
141 | }
|
---|
142 | }
|
---|
143 |
|
---|
144 | /*
|
---|
145 | * RCB3R}hÌðÍ
|
---|
146 | *
|
---|
147 | * óMµ½1oCgÉøÉwèµÄÄÑo·D
|
---|
148 | * d¶ÌÅãÅTRUEðÔ·D
|
---|
149 | */
|
---|
150 | boolean
|
---|
151 | rcb3_AddReceivedByte(uint8 c)
|
---|
152 | {
|
---|
153 | boolean rval = FALSE;
|
---|
154 | int i;
|
---|
155 | uint8 sum = 0;
|
---|
156 |
|
---|
157 | switch (s_rcb3_st) {
|
---|
158 | case RCB3_ST_HEADER_1:
|
---|
159 | if (c == RCB3_MSG_HEADER_1) {
|
---|
160 | s_rcb3_rmsg_cnt = 0;
|
---|
161 | g_rcb3_rmsg[s_rcb3_rmsg_cnt++] = c;
|
---|
162 | s_rcb3_st = RCB3_ST_BUTTON_1;
|
---|
163 | }
|
---|
164 | break;
|
---|
165 | case RCB3_ST_BUTTON_1:
|
---|
166 | g_rcb3_rmsg[s_rcb3_rmsg_cnt++] = c;
|
---|
167 | s_rcb3_st = RCB3_ST_BUTTON_2;
|
---|
168 | break;
|
---|
169 | case RCB3_ST_BUTTON_2:
|
---|
170 | g_rcb3_rmsg[s_rcb3_rmsg_cnt++] = c;
|
---|
171 | s_rcb3_st = RCB3_ST_ANALOG_1;
|
---|
172 | break;
|
---|
173 | case RCB3_ST_ANALOG_1:
|
---|
174 | g_rcb3_rmsg[s_rcb3_rmsg_cnt++] = c;
|
---|
175 | s_rcb3_st = RCB3_ST_ANALOG_2;
|
---|
176 | break;
|
---|
177 | case RCB3_ST_ANALOG_2:
|
---|
178 | g_rcb3_rmsg[s_rcb3_rmsg_cnt++] = c;
|
---|
179 | s_rcb3_st = RCB3_ST_ANALOG_3;
|
---|
180 | break;
|
---|
181 | case RCB3_ST_ANALOG_3:
|
---|
182 | g_rcb3_rmsg[s_rcb3_rmsg_cnt++] = c;
|
---|
183 | s_rcb3_st = RCB3_ST_ANALOG_4;
|
---|
184 | break;
|
---|
185 | case RCB3_ST_ANALOG_4:
|
---|
186 | g_rcb3_rmsg[s_rcb3_rmsg_cnt++] = c;
|
---|
187 | s_rcb3_st = RCB3_ST_SUM;
|
---|
188 | break;
|
---|
189 | case RCB3_ST_SUM:
|
---|
190 | g_rcb3_rmsg[s_rcb3_rmsg_cnt++] = c;
|
---|
191 | for(i = 1; i < (RCB3_MSG_LEN - 1); i++) {
|
---|
192 | sum += g_rcb3_rmsg[i];
|
---|
193 | }
|
---|
194 | sum &= 0x7f;
|
---|
195 | if (c == sum) {
|
---|
196 | rcb3_UpdateStatus();
|
---|
197 | rval = TRUE;
|
---|
198 | }else{
|
---|
199 | rcb3_error();
|
---|
200 | for(i = 0; i < (RCB3_MSG_LEN - 1); i++) {
|
---|
201 | g_rcb3_rmsg[0] = 0;
|
---|
202 | }
|
---|
203 | }
|
---|
204 | s_rcb3_st = RCB3_ST_HEADER_1;
|
---|
205 | break;
|
---|
206 | }
|
---|
207 | return rval;
|
---|
208 | }
|
---|