source: rc_autosar_rh850/trunk/os-application/BodyControl.c@ 112

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

最初のリリースファイルの追加

File size: 5.7 KB
Line 
1/*
2 * TOPPERS Software
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 * Software
5 *
6 * Copyright (C) 2014-2015 by Center for Embedded Computing Systems
7 * Graduate School of Information Science, Nagoya Univ., JAPAN
8 * Copyright (C) 2014-2015 by FUJI SOFT INCORPORATED, JAPAN
9 *
10 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
11 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
12 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
13 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
14 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
15 * スコード中に含まれていること.
16 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
17 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
18 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
19 * の無保証規定を掲載すること.
20 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
21 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
22 * と.
23 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
24 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
25 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
26 * 報告すること.
27 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
28 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
29 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
30 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
31 * 免責すること.
32 *
33 * 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕
34 * 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので
35 * はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利
36 * 用する者に対して,AUTOSARパートナーになることを求めている.
37 *
38 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
39 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
40 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
41 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
42 * の責任を負わない.
43 *
44 * $Id: BodyControl.c 113 2015-05-26 04:04:18Z honda $
45 */
46
47/*
48 * ボディ系関連
49 */
50
51#include "Os.h"
52#include "ModelCarControl.h"
53#include "t_syslog.h"
54
55/*
56 * ボディ系に関する初期化
57 */
58void
59BodyControlInit(void)
60{
61 tInitBody();
62}
63
64/*
65 * ランプに関する処理
66 */
67void
68LampControl(void)
69{
70 /* ヘッドランプ設定 */
71 HEAD_LAMP_SET(g_bodycmd.headlamp);
72 /* フォグランプ設定 */
73 FOG_LAMP_SET(g_bodycmd.foglamp);
74 /* ブレーキランプ設定 */
75 BRAKE_LAMP_SET(g_bodycmd.brakelamp);
76 /* バックランプ設定 */
77 BACK_LAMP_SET(g_bodycmd.backlamp);
78}
79
80/*
81 * ウィンカーの点滅周期用カウンタの初期値
82 */
83#define CNT_BLINK_INIT (WINKER_INTERVAL_MS/BODY_CYCLE_MS)
84
85/*
86 * ウィンカーに関する処理
87 */
88void
89WinkerControl(void)
90{
91 static uint8 pre_winker = WINKER_OFF;
92 static boolean pre_winker_lr = FALSE;
93 static boolean pre_winker_l = FALSE;
94 static boolean pre_winker_r = FALSE;
95 static uint32 cnt_blink = 0U;
96
97 /* 指示に変化があったタイミングから点滅周期を開始する */
98 if (g_bodycmd.winker != pre_winker) {
99 cnt_blink = 0U;
100 }
101
102 if (cnt_blink == 0U) {
103 switch (g_bodycmd.winker) {
104 case WINKER_OFF: /* 消灯 */
105 WINKER_L_SET(FALSE);
106 WINKER_R_SET(FALSE);
107 break;
108 case WINKER_L_ON: /* 左のみ点灯 */
109 WINKER_L_SET(TRUE);
110 break;
111 case WINKER_R_ON: /* 右のみ点灯 */
112 WINKER_R_SET(TRUE);
113 break;
114 case WINKER_LR_ON: /* 左右点灯 */
115 WINKER_L_SET(TRUE);
116 WINKER_R_SET(TRUE);
117 break;
118 case WINKER_L_BLINK: /* 左のみ点滅 */
119 if (pre_winker_l == FALSE) {
120 WINKER_L_SET(TRUE);
121 pre_winker_l = TRUE;
122 }
123 else {
124 WINKER_L_SET(FALSE);
125 pre_winker_l = FALSE;
126 }
127 break;
128 case WINKER_R_BLINK: /* 右のみ点滅 */
129 if (pre_winker_r == FALSE) {
130 WINKER_R_SET(TRUE);
131 pre_winker_r = TRUE;
132 }
133 else {
134 WINKER_R_SET(FALSE);
135 pre_winker_r = FALSE;
136 }
137 break;
138 case WINKER_LR_BLINK: /* 左右点滅 */
139 if (pre_winker_lr == FALSE) {
140 WINKER_L_SET(TRUE);
141 WINKER_R_SET(TRUE);
142 pre_winker_lr = TRUE;
143 }
144 else {
145 WINKER_L_SET(FALSE);
146 WINKER_R_SET(FALSE);
147 pre_winker_lr = FALSE;
148 }
149 break;
150 default:
151 break;
152 }
153 cnt_blink = CNT_BLINK_INIT;
154 }
155
156 cnt_blink--;
157
158 pre_winker = g_bodycmd.winker;
159}
160
161/*
162 * ボディ系タスク
163 */
164TASK(BodyControlTask)
165{
166 uint8 can_rx_data[8];
167 uint8 can_rx_size;
168 static boolean executed = FALSE;
169
170 /* 初回起動時のみ実行 */
171 if (executed == FALSE) {
172 syslog(LOG_NOTICE, "BodyControlTask : Start!");
173 executed = TRUE;
174 }
175
176 /* 制御系が別ECUならCANからメッセージを取得する.*/
177 if (!IsControlerOnECU) {
178 tCanGetRxData(BODYCMD_CANMSG_RXMBOX_ID, BODYCMD_CANMSG_ID,
179 &can_rx_data[0], &can_rx_size);
180 if (can_rx_size != 0) {
181 /* 受信メッセージの解析 */
182 UnpackBodyCmdCanMsg(can_rx_data);
183 }
184 }
185
186 /* ランプに関する処理 */
187 LampControl();
188
189 /* ウィンカーに関する処理 */
190 WinkerControl();
191
192 TerminateTask();
193}
194
195/*
196 * ブザー用のアラームコールバック
197 */
198ALARMCALLBACK(BuzzerControlCycAlarmCb){
199 static boolean buzzer_toggle = FALSE;
200 static uint16 buzzer_cycle = 0U;
201 boolean buzzer_on = FALSE;
202
203 switch (g_bodycmd.buzzer) {
204 case BUZZER_OFF:
205 /* 消音 */
206 buzzer_cycle = 0U;
207 break;
208 case BUZZER_ON:
209 /* 常時発音 */
210 buzzer_on = TRUE;
211 break;
212 case BUZZER_INTERVAL_ON:
213 /* 一定間隔で発音 */
214 buzzer_cycle++;
215 if (buzzer_cycle < ((BUZZER_INTERVAL_MS * 1000)/BUZZER_CYCLE_NS)) {
216 buzzer_on = TRUE;
217 }
218 if (buzzer_cycle == ((BUZZER_INTERVAL_MS * 1000)/BUZZER_CYCLE_NS)*2) {
219 buzzer_cycle = 0U;
220 }
221 break;
222 default:
223 break;
224 }
225
226 if (buzzer_on == TRUE) {
227 tSetBuzzer(buzzer_toggle);
228 buzzer_toggle = (buzzer_toggle == TRUE) ? FALSE : TRUE;
229 } else {
230 tSetBuzzer(FALSE);
231 }
232}
Note: See TracBrowser for help on using the repository browser.