source: rc_os_nios2/atk2-sc1_1.3.2/obj/nios2_dev_rc/rcb3.c@ 128

Last change on this file since 128 was 128, checked in by ertl-honda, 9 years ago

追加.

File size: 4.3 KB
Line 
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 * PS3ƒRƒ“ƒgƒ[ƒ‰‚̃{ƒ^ƒ“‚̐”
13 */
14#define PS3_NUM_OF_BUTTON 14
15#define PS3_NUM_OF_ANALOG 4
16
17
18/*
19 * “d•¶ƒtƒH[ƒ}ƒbƒg‚̃^ƒCƒv
20 */
21enum 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 * ŽóMƒƒbƒZ[ƒW‰ðÍ—pƒOƒ[ƒoƒ‹•Ï”
34 */
35static enum rcb3_st s_rcb3_st = RCB3_ST_HEADER_1;
36static int s_rcb3_rmsg_cnt;
37uint8 g_rcb3_rmsg[RCB3_MSG_LEN];
38
39/*
40 * ƒ{ƒ^ƒ“ƒƒbƒZ[ƒW”»•Ê—pƒOƒ[ƒoƒ‹•Ï”
41 */
42static 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 * ƒ{ƒ^ƒ“ó‘Ô•ÛŽ—pƒOƒ[ƒoƒ‹•Ï”
61 * ƒ_ƒuƒ‹ƒoƒbƒtƒ@‚Æ‚µ‚Ä‘Oó‘Ô‚ÆŒ»Ýó‘Ô‚ð•Û‘¶‚·‚é
62 */
63static boolean s_ps3button[2][PS3_NUM_OF_BUTTON];
64static sint8 s_ps3analog[2][PS3_NUM_OF_ANALOG];
65
66/*
67 * ‘Oó‘Ô‚ÆŒ»Ýó‘Ô‚ðŽ¦‚·ƒ|ƒCƒ“ƒ^
68 */
69boolean *p_g_pre_ps3button;
70boolean *p_g_cur_ps3button;
71sint8 *p_g_pre_ps3analog;
72sint8 *p_g_cur_ps3analog;
73
74
75void
76rcb3_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 * ƒ{ƒ^ƒ“î•ñ‚Í2ƒoƒCƒg‚Æ‚È‚Á‚Ä‚¢‚邽‚ß2ƒoƒCƒgƒf[ƒ^‚Æ‚µ‚Ä–ß‚·
89 */
90static uint16
91rcb3_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 * ƒ{ƒ^ƒ“ó‘Ԃ̍XV
102 */
103static void
104rcb3_UpdateStatus(void)
105{
106 boolean *tmp_button;
107 sint8 *tmp_analog;
108 int i;
109 uint16 button = rcb3_GetReceivedButton();
110
111 /*
112 * ‘Oó‘Ô‚ÆŒ»Ýó‘Ԃ̃|ƒCƒ“ƒ^‚ðXV
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 * Œ»Ý‚̃fƒWƒ^ƒ‹ƒ{ƒ^ƒ“‚̏ó‘Ô‚ðXV
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 * Œ»Ý‚̃AƒiƒƒOƒ{ƒ^ƒ“‚̏ó‘Ô‚ðXV
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 * RCB3ƒRƒ}ƒ“ƒh‚̉ðÍ
146 *
147 * ŽóM‚µ‚½1ƒoƒCƒg–ˆ‚Ɉø”‚ÉŽw’肵‚ČĂяo‚·D
148 * “d•¶‚̍Ōã‚ÅTRUE‚ð•Ô‚·D
149 */
150boolean
151rcb3_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}
Note: See TracBrowser for help on using the repository browser.