source: rc_autosar_rh850/trunk/driver/rcb3.c@ 113

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

ドライバーの追加.

File size: 6.0 KB
RevLine 
[113]1/*
2 * TOPPERS Software
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 * Software
5 *
6 * Copyright (C) 2015 by Center for Embedded Computing Systems
7 * Graduate School of Information Science, Nagoya Univ., JAPAN
8 *
9 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
10 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
11 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
12 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
13 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
14 * スコード中に含まれていること.
15 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
16 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
17 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
18 * の無保証規定を掲載すること.
19 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
20 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
21 * と.
22 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
23 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
24 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
25 * 報告すること.
26 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
27 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
28 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
29 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
30 * 免責すること.
31 *
32 * 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕
33 * 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので
34 * はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利
35 * 用する者に対して,AUTOSARパートナーになることを求めている.
36 *
37 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
38 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
39 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
40 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
41 * の責任を負わない.
42 *
43 * $Id: rcb3.c 20 2015-04-20 14:29:19Z honda $
44 */
45/*
46 * RCB3電文解析処理
47 */
48#include "Os.h"
49#include "rcb3.h"
50
51/*
52 * PS3コントローラのボタンの数
53 */
54#define PS3_NUM_OF_BUTTON 14
55#define PS3_NUM_OF_ANALOG 4
56
57/*
58 * 電文フォーマットのタイプ
59 */
60enum rcb3_st {
61 RCB3_ST_HEADER_1,
62 RCB3_ST_BUTTON_1,
63 RCB3_ST_BUTTON_2,
64 RCB3_ST_ANALOG_1,
65 RCB3_ST_ANALOG_2,
66 RCB3_ST_ANALOG_3,
67 RCB3_ST_ANALOG_4,
68 RCB3_ST_SUM,
69};
70
71/*
72 * 受信メッセージ解析用グローバル変数
73 */
74static enum rcb3_st s_rcb3_st = RCB3_ST_HEADER_1;
75static int s_rcb3_rmsg_cnt;
76uint8 g_rcb3_rmsg[RCB3_MSG_LEN];
77
78/*
79 * ボタンメッセージ判別用グローバル変数
80 */
81static const uint16 msg_button_pattern[PS3_NUM_OF_BUTTON] = {
82 RCB3_MSG_BUTTON_UP,
83 RCB3_MSG_BUTTON_DOWN,
84 RCB3_MSG_BUTTON_LEFT,
85 RCB3_MSG_BUTTON_RIGHT,
86 RCB3_MSG_BUTTON_TRIANGLE,
87 RCB3_MSG_BUTTON_CROSS,
88 RCB3_MSG_BUTTON_NOUGHT,
89 RCB3_MSG_BUTTON_SQUARE,
90 RCB3_MSG_BUTTON_L1,
91 RCB3_MSG_BUTTON_L2,
92 RCB3_MSG_BUTTON_R1,
93 RCB3_MSG_BUTTON_R2,
94 RCB3_MSG_BUTTON_START,
95 RCB3_MSG_BUTTON_SELECT
96};
97
98/*
99 * ボタン状態保持用グローバル変数
100 * ダブルバッファとして前状態と現在状態を保存する
101 */
102static boolean s_ps3button[2][PS3_NUM_OF_BUTTON];
103static sint8 s_ps3analog[2][PS3_NUM_OF_ANALOG];
104
105/*
106 * 前状態と現在状態を示すポインタ
107 */
108boolean *p_g_pre_ps3button;
109boolean *p_g_cur_ps3button;
110sint8 *p_g_pre_ps3analog;
111sint8 *p_g_cur_ps3analog;
112
113
114void
115rcb3_Init(void)
116{
117 /* Init button */
118 p_g_pre_ps3button = s_ps3button[0];
119 p_g_cur_ps3button = s_ps3button[1];
120 p_g_pre_ps3analog = s_ps3analog[0];
121 p_g_cur_ps3analog = s_ps3analog[1];
122}
123
124/*
125 * ボタン情報は2バイトとなっているため2バイトデータとして戻す
126 */
127static uint16
128rcb3_GetReceivedButton()
129{
130 uint16 button_cmd;
131
132 button_cmd = (g_rcb3_rmsg[RCB3_MSG_OFFSET_BUTTON_H] << 8) | g_rcb3_rmsg[RCB3_MSG_OFFSET_BUTTON_L];
133
134 return button_cmd;
135}
136
137/*
138 * ボタン状態の更新
139 */
140static void
141rcb3_UpdateStatus(void)
142{
143 boolean *tmp_button;
144 sint8 *tmp_analog;
145 int i;
146 uint16 button = rcb3_GetReceivedButton();
147
148 /*
149 * 前状態と現在状態のポインタを更新
150 */
151 tmp_button = p_g_pre_ps3button;
152 tmp_analog = p_g_pre_ps3analog;
153
154 p_g_pre_ps3button = p_g_cur_ps3button;
155 p_g_pre_ps3analog = p_g_cur_ps3analog;
156
157 p_g_cur_ps3button = tmp_button;
158 p_g_cur_ps3analog = tmp_analog;
159
160 /*
161 * 現在のデジタルボタンの状態を更新
162 */
163 for(i = 0; i < PS3_NUM_OF_BUTTON; i++) {
164 if ((button & msg_button_pattern[i])) {
165 p_g_cur_ps3button[i] = TRUE;
166 }
167 else {
168 p_g_cur_ps3button[i] = FALSE;
169 }
170 }
171
172 /*
173 * 現在のアナログボタンの状態を更新
174 */
175 for(i = 0; i < PS3_NUM_OF_ANALOG; i++) {
176 uint8 val = g_rcb3_rmsg[RCB3_MSG_OFFSET_L_ANALOG_LR + i];
177 p_g_cur_ps3analog[i] = ((sint8)val - RCB3_MSG_ANALOG_NEUTRAL);
178 }
179}
180
181/*
182 * RCB3コマンドの解析
183 *
184 * 受信した1バイト毎に引数に指定して呼び出す.
185 * 電文の最後でTRUEを返す.
186 */
187boolean
188rcb3_AddReceivedByte(uint8 c)
189{
190 boolean rval = FALSE;
191 int i;
192 uint8 sum = 0;
193
194 switch (s_rcb3_st) {
195 case RCB3_ST_HEADER_1:
196 if (c == RCB3_MSG_HEADER_1) {
197 s_rcb3_rmsg_cnt = 0;
198 g_rcb3_rmsg[s_rcb3_rmsg_cnt++] = c;
199 s_rcb3_st = RCB3_ST_BUTTON_1;
200 }
201 break;
202 case RCB3_ST_BUTTON_1:
203 g_rcb3_rmsg[s_rcb3_rmsg_cnt++] = c;
204 s_rcb3_st = RCB3_ST_BUTTON_2;
205 break;
206 case RCB3_ST_BUTTON_2:
207 g_rcb3_rmsg[s_rcb3_rmsg_cnt++] = c;
208 s_rcb3_st = RCB3_ST_ANALOG_1;
209 break;
210 case RCB3_ST_ANALOG_1:
211 g_rcb3_rmsg[s_rcb3_rmsg_cnt++] = c;
212 s_rcb3_st = RCB3_ST_ANALOG_2;
213 break;
214 case RCB3_ST_ANALOG_2:
215 g_rcb3_rmsg[s_rcb3_rmsg_cnt++] = c;
216 s_rcb3_st = RCB3_ST_ANALOG_3;
217 break;
218 case RCB3_ST_ANALOG_3:
219 g_rcb3_rmsg[s_rcb3_rmsg_cnt++] = c;
220 s_rcb3_st = RCB3_ST_ANALOG_4;
221 break;
222 case RCB3_ST_ANALOG_4:
223 g_rcb3_rmsg[s_rcb3_rmsg_cnt++] = c;
224 s_rcb3_st = RCB3_ST_SUM;
225 break;
226 case RCB3_ST_SUM:
227 g_rcb3_rmsg[s_rcb3_rmsg_cnt++] = c;
228 for(i = 1; i < (RCB3_MSG_LEN - 1); i++) {
229 sum += g_rcb3_rmsg[i];
230 }
231 sum &= 0x7f;
232 if (c == sum) {
233 rcb3_UpdateStatus();
234 rval = TRUE;
235 }
236 else{
237 rcb3_ErrorCb(sum, c, g_rcb3_rmsg);
238 }
239 s_rcb3_st = RCB3_ST_HEADER_1;
240 break;
241 }
242 return rval;
243}
Note: See TracBrowser for help on using the repository browser.