source: rc_autosar_rh850/trunk/swc-application/common/swcs/CddController.c@ 122

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

ID属性の付加.

  • Property svn:keywords set to Id
File size: 7.0 KB
Line 
1/*
2 * Copyright (C) 2014-2015 by Embedded and Real-Time Systems Laboratory
3 * Graduate School of Information Science, Nagoya Univ., JAPAN
4 * Copyright (C) 2014-2015 by FUJI SOFT INCORPORATED, JAPAN
5 *
6 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
7 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
8 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
9 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
10 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
11 * スコード中に含まれていること.
12 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
13 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
14 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
15 * の無保証規定を掲載すること.
16 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
17 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
18 * と.
19 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
20 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
21 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
22 * 報告すること.
23 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
24 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
25 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
26 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
27 * 免責すること.
28 *
29 *
30 * 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕
31 * 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので
32 * はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利
33 * 用する者に対して,AUTOSARパートナーになることを求めている.
34 *
35 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
36 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
37 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
38 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
39 * の責任を負わない.
40 *
41 * $Id: CddController.c 122 2015-07-17 01:31:28Z ertl-honda $
42 */
43
44/*
45 * CDD SW-C CddController用の記述
46 */
47
48#include "Rte_CddController.h"
49#include "ModelCarControl.h"
50#include "t_syslog.h"
51#include "rcb3.h"
52
53/*
54 * CDD SW-C CddController用の初期化
55 */
56void
57CddControllerInit(void)
58{
59 tInitSBDBTUart();
60 rcb3_Init();
61}
62
63#ifdef TOPPERS_WITH_DISP
64/*
65 * 状態表示関連
66 */
67#define DISP_MSG_LEN 8
68#define DISP_MSG_HEADER_1 0xF0
69
70typedef enum disp_st {
71 DISP_ST_HEADER_1,
72 DISP_ST_CYCLE_1,
73 DISP_ST_CYCLE_2,
74 DISP_ST_INFO_1,
75 DISP_ST_INFO_2,
76 DISP_ST_INFO_3,
77 DISP_ST_INFO_4,
78 DISP_ST_SUM
79} disp_st_type;
80
81static disp_st_type s_disp_st = DISP_ST_HEADER_1;
82static uint8 s_disp_rmsg_cnt;
83static uint8 g_disp_rmsg[DISP_MSG_LEN];
84
85static boolean disp_AddReceivedByte(uint8 c);
86#endif /* TOPPERS_WITH_DISP */
87
88
89/* 無効値(受信していない) */
90#define NOT_RECEIVE_COMMAND 0xFFFFFFFFU
91
92/* 受信モード */
93typedef enum {
94 RX_MODE_INIT,
95 RX_MODE_RCB3,
96#ifdef TOPPERS_WITH_DISP
97 RX_MODE_DISP
98#endif /* TOPPERS_WITH_DISP */
99} rx_mode_type;
100
101/* TRUEで初期化することで不定値を取得しないようにする */
102static IDT_RCB3 RCB3CommandData;
103static boolean RCB3CommandGotFlg = TRUE;
104#ifdef TOPPERS_WITH_DISP
105static IDT_Disp DisplayCommandData;
106static boolean DisplayCommandGotFlg = TRUE;
107#endif /* TOPPERS_WITH_DISP */
108
109static rx_mode_type rx_mode = RX_MODE_INIT;
110
111/*
112 * RunnableEntity(オペレーション呼出し)
113 */
114void
115GetRCB3Command(IDT_RCB3 *command)
116{
117 if (RCB3CommandGotFlg == FALSE) {
118 *command = RCB3CommandData;
119 RCB3CommandGotFlg = TRUE;
120 }
121 else {
122 *command = NOT_RECEIVE_COMMAND;
123 }
124}
125
126/*
127 * MessageParserランナブル
128 */
129void
130MessageParser(void)
131{
132 uint8 c;
133
134 while (tReceiveSBDBTUart(&c, 1)) {
135 switch (rx_mode) {
136 case RX_MODE_INIT:
137 if (c == RCB3_MSG_HEADER_1) {
138 /* RCB3データ受信開始 */
139 (void) rcb3_AddReceivedByte(c);
140 rx_mode = RX_MODE_RCB3;
141 }
142#ifdef TOPPERS_WITH_DISP
143 else if (c == DISP_MSG_HEADER_1) {
144 /* 状態表示データ受信開始 */
145 (void) disp_AddReceivedByte(c);
146 rx_mode = RX_MODE_DISP;
147 }
148#endif /* TOPPERS_WITH_DISP */
149 else {
150 syslog(LOG_INFO, "## Header Error (0x%x)", c);
151 }
152 break;
153 case RX_MODE_RCB3:
154 if (rcb3_AddReceivedByte(c)) {
155 /* RCB3データ受信完了 */
156 RCB3CommandData = (IDT_RCB3) g_rcb3_rmsg[RCB3_MSG_OFFSET_BUTTON_L]; /* ボタン情報1 */
157 RCB3CommandData += ((IDT_RCB3) g_rcb3_rmsg[RCB3_MSG_OFFSET_BUTTON_H]) << 8U;/* ボタン情報2 */
158 RCB3CommandData += ((IDT_RCB3) g_rcb3_rmsg[RCB3_MSG_OFFSET_L_ANALOG_LR]) << 16U; /* アナログ1 */
159 RCB3CommandData += ((IDT_RCB3) g_rcb3_rmsg[RCB3_MSG_OFFSET_R_ANALOG_UD]) << 24U; /* アナログ4 */
160 RCB3CommandGotFlg = FALSE;
161 rx_mode = RX_MODE_INIT;
162 }
163 break;
164#ifdef TOPPERS_WITH_DISP
165 case RX_MODE_DISP:
166 if (disp_AddReceivedByte(c)) {
167 /* 状態表示データ受信完了 */
168 DisplayCommandData = (IDT_Disp) g_disp_rmsg[1]; /* 周期表示1 */
169 DisplayCommandData += ((IDT_Disp) g_disp_rmsg[2]) << 8U; /* 周期表示2 */
170 DisplayCommandData += ((IDT_Disp) g_disp_rmsg[3]) << 16U; /* 状態表示 */
171 DisplayCommandGotFlg = FALSE;
172 rx_mode = RX_MODE_INIT;
173 }
174 break;
175#endif /* TOPPERS_WITH_DISP */
176 }
177 }
178}
179
180/*
181 * rcb3_AddReceivedByteからのエラーコールバック
182 */
183void
184rcb3_ErrorCb(uint8 sum, uint8 recv_sum, uint8 *p_rcb3_rmsg)
185{
186 uint32 i;
187
188 rx_mode = RX_MODE_INIT;
189 syslog(LOG_INFO, "## RCB3 Sum Error: 0x%x != 0x%x", sum, recv_sum);
190 for (i = 0; i < RCB3_MSG_LEN; i++) {
191 syslog(LOG_INFO, "## rcb3_rmsg[%d]: 0x%x", i, p_rcb3_rmsg[i]);
192 }
193}
194
195#ifdef TOPPERS_WITH_DISP
196void
197GetDisplayCommand(IDT_Disp *command)
198{
199 if (DisplayCommandGotFlg == FALSE) {
200 *command = DisplayCommandData;
201 DisplayCommandGotFlg = TRUE;
202 }
203 else {
204 *command = NOT_RECEIVE_COMMAND;
205 }
206}
207
208boolean
209disp_AddReceivedByte(uint8 c)
210{
211 boolean rval = FALSE;
212 uint8 i;
213 uint8 sum = 0;
214
215 switch (s_disp_st) {
216 case DISP_ST_HEADER_1:
217 if (c == DISP_MSG_HEADER_1) {
218 s_disp_rmsg_cnt = 0;
219 g_disp_rmsg[s_disp_rmsg_cnt++] = c;
220 s_disp_st = DISP_ST_CYCLE_1;
221 }
222 break;
223 case DISP_ST_CYCLE_1:
224 g_disp_rmsg[s_disp_rmsg_cnt++] = c;
225 s_disp_st = DISP_ST_CYCLE_2;
226 break;
227 case DISP_ST_CYCLE_2:
228 g_disp_rmsg[s_disp_rmsg_cnt++] = c;
229 s_disp_st = DISP_ST_INFO_1;
230 break;
231 case DISP_ST_INFO_1:
232 g_disp_rmsg[s_disp_rmsg_cnt++] = c;
233 s_disp_st = DISP_ST_INFO_2;
234 break;
235 case DISP_ST_INFO_2:
236 g_disp_rmsg[s_disp_rmsg_cnt++] = c;
237 s_disp_st = DISP_ST_INFO_3;
238 break;
239 case DISP_ST_INFO_3:
240 g_disp_rmsg[s_disp_rmsg_cnt++] = c;
241 s_disp_st = DISP_ST_INFO_4;
242 break;
243 case DISP_ST_INFO_4:
244 g_disp_rmsg[s_disp_rmsg_cnt++] = c;
245 s_disp_st = DISP_ST_SUM;
246 break;
247 case DISP_ST_SUM:
248 g_disp_rmsg[s_disp_rmsg_cnt++] = c;
249 for (i = 1; i < (DISP_MSG_LEN - 1); i++) {
250 sum += g_disp_rmsg[i];
251 }
252 sum &= 0x7FU;
253 if (c == sum) {
254 rval = TRUE;
255 }
256 else {
257 rx_mode = RX_MODE_INIT;
258 syslog(LOG_INFO, "## Disp Sum Error: 0x%x != 0x%x", sum, c);
259 for (i = 0; i < DISP_MSG_LEN; i++) {
260 syslog(LOG_INFO, "## g_disp_rmsg[%d]: 0x%x", i, g_disp_rmsg[i]);
261 }
262 }
263 s_disp_st = DISP_ST_HEADER_1;
264 break;
265 }
266 return(rval);
267}
268#endif /* TOPPERS_WITH_DISP */
Note: See TracBrowser for help on using the repository browser.