source: rc_os_nios2/trunk/atk2-sc1_1.3.2/obj/nios2_dev_rc/cmd_rcb3.c@ 295

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

追加.

File size: 19.2 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: cmd_rcb3_can.c 228 2014-09-12 13:21:15Z honda $
6 */
7
8/*
9
10›Žd—l
11
12EƒRƒ}ƒ“ƒh
13 SBXBT‚Ì PS3ƒRƒ“ƒgƒ[ƒ‰/USBƒQ[ƒ€ƒpƒbƒhUART•ÏŠ·ƒtƒ@[ƒ€ƒEƒFƒA
14 (http://runningele.web.fc2.com/) ‚ŃTƒ|[ƒg‚µ‚Ä‚¢‚éRCB3‚ɑΉž
15 ‚µ‚Ä‚¢‚éD
16
17 UARTƒ|[ƒg2‚ÆCANŒo—R‚ŃRƒ}ƒ“ƒh‚ðŽó‚¯Žæ‚éD•¹—p‚·‚é‚ÆUART‚©‚ç‚Ì
18 ƒRƒ}ƒ“ƒh‚ÌŽæ‚肱‚Ú‚µ‚ª”­¶‚·‚邽‚ß’ˆÓ‚·‚邱‚ƁD
19
20E‹N“®Žž
21 ‘S‚Ä‚ÌLED‚ð0.5•bŽüŠú‚Å3•b“_–Å‚³‚¹‚éD
22
23Eƒ{ƒ^ƒ“‘€‘Ç
24 ¶E‰E ƒ{ƒ^ƒ“
25 EƒXƒeƒAƒŠƒ“ƒO‚̃jƒ…
26[ƒgƒ‰ƒ‹‚𒲐®D
27 Eƒ{ƒ^ƒ“‚ð‰Ÿ‚·‚Æ•ûŒüŽwŽ¦Ší‚ªONC—£‚·‚ÆOFF
28 ãƒ{ƒ^ƒ“
29 EƒXƒeƒAƒŠƒ“ƒO‚ðƒjƒ…
30[ƒgƒ‰ƒ‹‚É‚·‚é
31 ‰ºƒ{ƒ^ƒ“
32 Eƒ‚[ƒ^§Œä‚̃QƒCƒ“‚ð‰Šú’l‚É‚·‚é
33 L1/R1
34 E•ûŒüŽwŽ¦Ší‚ðON/OFF‚·‚éD
35 L2/R2
36 Eƒ‚[ƒ^§Œä‚̃QƒCƒ“‚ð•ÏX
37 ~
38 EƒuƒŒ[ƒL
39 ¢
40 EƒnƒU[ƒh
41 ›
42 EƒƒCƒ“ƒwƒbƒhƒ‰ƒCƒgØ‚è‘Ö‚¦()
43  
44 EƒMƒAØ‚è‘Ö‚¦(D -> N -> B -> N)
45 */
46//#include "rc.h"
47//#include "cmd_msg.h"
48//#include "uart.h"
49//#include "fcan.h"
50#include "rcb3.h"
51#include "comuart.h"
52
53/*
54 * ‘O•ûŽQÆ
55 */
56static void onMsgUart(void);
57static void onMsgCAN(void);
58static void onMsgPS3(void);
59static void onTimer10m(void);
60static void onTimer50m(void);
61static void onTimer100m(void);
62
63/*
64 * ŠeŽí’è‹`
65 */
66
67/*
68 * ƒjƒ…
69[ƒgƒ‰ƒ‹Žž‚̃XƒeƒAƒŠƒ“ƒOŠp“x‚̏‰Šú’l
70 */
71#define STEER_NEUTRAL_INIT 0
72
73
74/*
75 * ƒ‚[ƒ^ƒQƒCƒ“‚̏‰Šú’l
76 */
77#define MOTOR_GAIN_INIT 2
78
79
80/*
81 * ƒƒOo—Í—p‚̃|[ƒg”ԍ†‚ƃCƒxƒ“ƒg”ԍ†
82 */
83#define RC_OUTPUT_PORT 2
84#define RC_EVENT_OUTPUT_PORT (0x10 << RC_OUTPUT_PORT)
85
86
87/*
88 * ‹N“®Žž‚̃{ƒfƒB[Œn‚̐ڑ±ƒeƒXƒg—pÝ’è
89 */
90#define INIT_BODY_BLINK_COUNT 3
91#define INIT_BODY_BLINK_CYCLE 500
92
93
94/*
95 * §ŒäŠÖ˜A‚̕ϐ”
96 */
97float g_steer_neutral = STEER_NEUTRAL_INIT;
98float g_angle = 0;
99float g_speed = 0;
100int g_speed_gain = MOTOR_GAIN_INIT;
101boolean g_blinker_l_blink = FALSE;
102boolean g_blinker_r_blink = FALSE;
103boolean g_isBrake = FALSE;
104
105
106/*
107 * CANŠÖ˜A
108 */
109
110/*
111 * ƒ{ƒfƒB[Œn‚Ö‚ÌŽwŽ¦ƒRƒ}ƒ“ƒh—pCANƒƒbƒZ[ƒWID
112 */
113#define BODY_CAN_MSG_ID 16
114
115/*
116 * ŽóMƒRƒ}ƒ“ƒh—pCANƒƒbƒZ[ƒWID
117 */
118#define CONT_CMD_CAN_MSG_ID 3
119
120/*
121 * ‘—M‚̃Šƒgƒ‰ƒC‰ñ”‚̏ãŒÀ
122 */
123#define CAN_RETRY_LIMIT 50
124
125/*
126 * CAN’ʐM‚ðŽg—p‚·‚é‚©‚̃tƒ‰ƒO
127 */
128boolean g_use_can = TRUE;
129
130/*
131 * CAN’ʐM‚ðÄŠJ‚·‚é‰ñ”
132 */
133#define CAN_REUSE_CNT_LIMIT 1000
134
135/*
136 * CAN’ʐMÄŠJ—p•Ï”
137 */
138int g_can_reuse_cnt = 0;
139
140/*
141 * CANŠÖ˜A‚̏‰Šú‰»
142 */
143void
144can_init(void)
145{
146 /* CANƒ|[ƒg‰Šú‰» */
147 FCan0InitPort(0);
148
149 /* CAM‰Šú‰» */
150 FcanInit(0);
151
152 /* ƒ[ƒ‹ƒ{ƒbƒNƒX‰Šú‰» */
153 FcanSetMailBoxInfo(0, 0, DIR_SEND, IDE_STD, BODY_CAN_MSG_ID, 0, 0 );
154 FcanSetMailBoxInfo(0, 1, DIR_RECV, IDE_STD, CONT_CMD_CAN_MSG_ID, 0, 0 );
155
156 /* CANƒXƒ^[ƒg */
157 FcanEnable(0);
158}
159
160/*
161 * CANƒƒbƒZ[ƒW‚Ì‘—M
162 */
163void
164can_send(uint8 *tx_data, uint8 len)
165{
166 int cnt = 0;
167 STATUS status;
168
169 /* CAN’ʐM’âŽ~ó‘Ԃ̏ꍇ */
170 if (!g_use_can) {
171 g_can_reuse_cnt++;
172 if (g_can_reuse_cnt == CAN_REUSE_CNT_LIMIT) {
173 g_use_can = TRUE;
174 g_can_reuse_cnt = 0;
175 } else {
176 return;
177 }
178 }
179
180 while(1){
181 status = FcanSetTxData(0, 0, &tx_data[0], len);
182 if(status != STATUS_OK ) {
183 if (cnt++ > CAN_RETRY_LIMIT) {
184 g_use_can = FALSE;
185 uart_PSendString(RC_OUTPUT_PORT, "CAN connect error! Execute without CAN. \r\n");
186 break;
187 }
188 }else{
189 break;
190 }
191 }
192}
193
194/*
195 * ƒ{ƒfƒB[ECU‚ւ̏ó‘ÔŽwŽ¦\‘¢‘Ì
196 */
197typedef struct {
198 uint8_t headlight1;
199 uint8_t headlight2;
200 uint8_t headlight3;
201 uint8_t breaklamp;
202 uint8_t backlamp;
203 uint8_t buzzer;
204 uint8_t blinker_l;
205 uint8_t blinker_r;
206 uint8_t hazardlamp;
207}BODY_CONT_INFO;
208
209/*
210 * ƒ{ƒfƒB[‚̃AƒCƒeƒ€‚ÌON/OFFƒ}ƒNƒ
211 */
212#define BODY_CONT_ON 1
213#define BODY_CONT_OFF 0
214#define BODY_CONT_BLINK 2
215
216/*
217 * ƒ{ƒfƒB[ECU‚ւ̏ó‘ÔŽwŽ¦—p•Ï”
218 */
219BODY_CONT_INFO g_body_cont_info;
220
221/*
222 * ŽüŠú‘—M‚Æ‚·‚é‚©
223 */
224boolean g_body_can_msg_cyclic = TRUE;
225
226/*
227 ƒ{ƒfƒB[§ŒäCANƒƒbƒZ[ƒWŽd—l
228
229 ‘—MŽüŠú : 50ms
230 ƒƒbƒZ[ƒWID : 16
231 ƒƒbƒZ[ƒW’· : 11bit
232
233 offset bits bit assign
234 ƒwƒbƒhƒ‰ƒCƒg1 : 0 : 1 : 1:ON 0:OFF
235 ƒwƒbƒhƒ‰ƒCƒg2 : 1 : 1 : 1:ON 0:OFF
236 ƒwƒbƒhƒ‰ƒCƒg3 : 2 : 1 : 1:ON 0:OFF
237 ƒuƒŒ[ƒLƒ‰ƒ“ƒv : 3 : 1 : 1:ON 0:OFF
238 ƒoƒbƒNƒ‰ƒ“ƒv : 4 : 1 : 1:ON 0:OFF
239 ƒuƒU[ : 5 : 1 : 1:ON 0:OFF 2:BLINK
240 ƒEƒBƒ“ƒJ[L : 8 : 2 : 1:ON 0:OFF 2:BLINK
241 ƒEƒBƒ“ƒJ[R : 10 : 2 : 1:ON 0:OFF 2:BLINK
242 ƒnƒU[ƒhƒ‰ƒ“ƒv : 12 : 1 : 1:ON 0:OFF 2:BLINK
243 */
244
245void
246body_can_msg_send(void)
247{
248 uint8 tx_data[8];
249 /* ‘O‰ñ‘—•t‚̏ó‘Ô */
250 static BODY_CONT_INFO g_pre_body_cont_info;
251
252 /* ó‘ÔŽwŽ¦‚ɕω»‚ª–³‚¯‚ê‚Α—M‚µ‚È‚¢ */
253 if (!g_body_can_msg_cyclic){
254 if((g_body_cont_info.headlight1 == g_pre_body_cont_info.headlight1) &&
255 (g_body_cont_info.headlight2 == g_pre_body_cont_info.headlight2) &&
256 (g_body_cont_info.headlight3 == g_pre_body_cont_info.headlight3) &&
257 (g_body_cont_info.breaklamp == g_pre_body_cont_info.breaklamp) &&
258 (g_body_cont_info.backlamp == g_pre_body_cont_info.backlamp) &&
259 (g_body_cont_info.buzzer == g_pre_body_cont_info.buzzer) &&
260 (g_body_cont_info.blinker_l == g_pre_body_cont_info.blinker_l) &&
261 (g_body_cont_info.blinker_r == g_pre_body_cont_info.blinker_r) &&
262 (g_body_cont_info.hazardlamp == g_pre_body_cont_info.hazardlamp)) {
263 return;
264 }
265 }
266
267 /* ‘—MƒƒbƒZ[ƒW‚𐶐¬ */
268 tx_data[0] = ((g_body_cont_info.headlight1 << 7) & 0x80) |
269 ((g_body_cont_info.headlight2 << 6) & 0x40) |
270 ((g_body_cont_info.headlight3 << 5) & 0x20) |
271 ((g_body_cont_info.breaklamp << 4) & 0x10) |
272 ((g_body_cont_info.backlamp << 3) & 0x08) |
273 ((g_body_cont_info.buzzer << 1) & 0x06);
274
275 tx_data[1] = ((g_body_cont_info.blinker_l << 6) & 0xc0) |
276 ((g_body_cont_info.blinker_r << 4) & 0x30) |
277 ((g_body_cont_info.hazardlamp << 3) & 0x08);
278
279 can_send(tx_data, 2);
280
281 g_pre_body_cont_info = g_body_cont_info;
282}
283
284
285/*
286 * ‹N“®Žž‚̃{ƒfƒB[‚̐ڑ±Šm”F
287 *
288 * ‘SLED“_–łƃuƒU[‚ð–‚炷D
289 */
290void
291body_check(void)
292{
293 int loop, tcnt;
294 uint8_t status = BODY_CONT_ON;
295
296 for(loop = 0; loop < INIT_BODY_BLINK_COUNT*2; loop++) {
297 g_body_cont_info.headlight1 = status;
298 g_body_cont_info.headlight2 = status;
299 g_body_cont_info.headlight3 = status;
300 g_body_cont_info.breaklamp = status;
301 g_body_cont_info.backlamp = status;
302 g_body_cont_info.buzzer = status;
303 g_body_cont_info.blinker_l = status;
304 g_body_cont_info.blinker_r = status;
305
306 body_can_msg_send();
307
308 tcnt = 0;
309 while(1) {
310 rc_WaitEvent(RC_EVENT_TIMER);
311 rc_ClearEvent(RC_EVENT_TIMER);
312 tcnt++;
313 if (tcnt == INIT_BODY_BLINK_CYCLE) {
314 break;
315 }
316 }
317
318 status = (status == BODY_CONT_ON)? BODY_CONT_OFF : BODY_CONT_ON;
319 }
320}
321
322
323/*
324 * ƒƒCƒ“ŠÖ”
325 */
326void
327cmd_rcb3_Main(void)
328{
329 int tcnt = 0;
330 uint32_t event;
331
332 uart_Init(RC_OUTPUT_PORT, 115200);
333
334 uart_PSendString(RC_OUTPUT_PORT, "Initialize hardware start. \r\n");
335
336 can_init();
337
338 body_check();
339
340 SetServoControlMode(TRUE);
341 SetServoEnable(SERVO_ON);
342 SetSteerAngle(STEER_NEUTRAL_INIT);
343 SetControlParam(1.0f, 1.0f, 0);
344 SetMotorEnable(MOTOR_ON);
345
346 rcb3_Init();
347
348 uart_PSendString(RC_OUTPUT_PORT, "Initialize hardware done. \r\n");
349
350 while (1) {
351 event = rc_WaitEvent(RC_EVENT_CMD_PORT|RC_EVENT_TIMER);
352
353 if (event & RC_EVENT_OUTPUT_PORT) {
354 rc_ClearEvent(RC_EVENT_OUTPUT_PORT);
355 onMsgUart();
356 }
357
358 if (event & RC_EVENT_TIMER) {
359 rc_ClearEvent(RC_EVENT_TIMER);
360 onMsgCAN();
361 tcnt++;
362 if (tcnt % 10 == 0) {
363 onTimer10m();
364 }
365 if (tcnt % 50 == 0) {
366 onTimer50m();
367 }
368 if (tcnt == 100) {
369 tcnt = 0;
370 onTimer100m();
371 }
372 }
373 }
374}
375
376/*
377 * I—¹ˆ—
378 */
379void
380cmd_rcb3_Exit(void)
381{
382 /* ‹ì“®ƒ‚[ƒ^‚ð’âŽ~ */
383 mot_SetOutput(0);
384}
385
386/*
387 * UART‚©‚ç‚̃ƒbƒZ[ƒW‚ÌŽóMˆ—
388 */
389void
390onMsgUart(void)
391{
392 uint8_t c;
393 while (uart_Get(RC_OUTPUT_PORT, &c, 1)) {
394 /*
395 * —LŒø‚È“d•¶‚ðŽó‚¯Žæ‚Á‚½ê‡‚́C“d•¶‚ɉž‚¶‚½ˆ—‚ðŽÀŽ{
396 */
397 if (rcb3_AddReceivedByte(c)) {
398 onMsgPS3();
399 }
400 }
401}
402
403/*
404 * CAN‚©‚ç‚̃ƒbƒZ[ƒWŽóMˆ—
405 */
406void onMsgCAN(void)
407{
408 uint8 rx_data[8];
409 uint8 rx_size;
410 int loop;
411 BOOL result;
412 char str[30];
413
414 FcanGetRxData(0, 1, &rx_data[0], &rx_size);
415 if (rx_size == 0) {
416 return;
417 }
418
419// sprintf(str, "Can data 0x%x, 0x%x, 0x%x\r\n", rx_data[0], rx_data[1], rx_data[2]);
420// uart_PSendString(RC_OUTPUT_PORT, str);
421
422 for (loop = 0; loop < rx_size; loop++){
423 result = rcb3_AddReceivedByte(rx_data[loop]);
424 }
425
426 if (result) {
427 onMsgPS3();
428 }
429 else {
430 sprintf(str, "Received Can data Error!\r\n");
431 uart_PSendString(RC_OUTPUT_PORT, str);
432 }
433}
434
435/*
436 * 10mŽüŠú‚ŌĂяo‚³‚ê‚éD
437 */
438void onTimer10m(void)
439{
440
441}
442
443/*
444 * 50mŽüŠú‚ŌĂяo‚³‚ê‚éD
445 */
446void onTimer50m(void)
447{
448 /* ƒ{ƒfƒB[Œn‚Ö‚ÌŽwŽ¦‚𑗐M */
449 body_can_msg_send();
450}
451
452/*
453 * 100mŽüŠú‚ŌĂяo‚³‚ê‚éD
454 */
455void onTimer100m(void)
456{
457
458}
459
460
461/*
462 * RoboCar§Œäƒ‰ƒCƒuƒ‰ƒŠ
463 */
464
465
466/*
467 * ƒXƒeƒAƒŠƒ“ƒOƒjƒ…
468[ƒgƒ‰ƒ‹‚ð‰Šú’l‚É
469 */
470void
471InitSteerNetural(void)
472{
473 char str[30];
474 g_steer_neutral = STEER_NEUTRAL_INIT;
475 SetSteerAngle(g_steer_neutral);
476 sprintf(str, "Set steer neutral = %2.1f \r\n", g_steer_neutral);
477 uart_PSendString(RC_OUTPUT_PORT, str);
478}
479
480/*
481 * ƒXƒeƒAƒŠƒ“ƒOƒjƒ…
482[ƒgƒ‰ƒ‹‚ð¶‘¤‚É
483 */
484void
485AdjustSteerNeturalL(void)
486{
487 char str[30];
488 if(g_steer_neutral < 30) {
489 g_steer_neutral++;
490 SetSteerAngle(g_steer_neutral);
491 sprintf(str, "Adjust steer neutral = %2.1f \r\n", g_steer_neutral);
492 uart_PSendString(RC_OUTPUT_PORT, str);
493 }
494}
495
496/*
497 * ƒXƒeƒAƒŠƒ“ƒOƒjƒ…
498[ƒgƒ‰ƒ‹‚ð‰E‘¤‚É
499 */
500void
501AdjustSteerNeturalR(void)
502{
503 char str[30];
504 if(g_steer_neutral > -30) {
505 g_steer_neutral--;
506 SetSteerAngle(g_steer_neutral);
507 sprintf(str, "Adjust steer neutral = %2.1f \r\n", g_steer_neutral);
508 uart_PSendString(RC_OUTPUT_PORT, str);
509 }
510}
511
512
513/*
514 * ƒXƒs[ƒhƒQƒCƒ“‚ðã‚°‚é
515 */
516void
517AdjustSpeedGainU(void)
518{
519 char str[30];
520 if(g_speed_gain < 10) {
521 g_speed_gain++;
522 SetDriveSpeed(g_speed/g_speed_gain);
523 sprintf(str, "Adjust speed gain = %d \r\n", g_speed_gain);
524 uart_PSendString(RC_OUTPUT_PORT, str);
525 }
526}
527
528/*
529 * ƒXƒs[ƒhƒQƒCƒ“‚ð‰º‚°‚é
530 */
531void
532AdjustSpeedGainD(void)
533{
534 char str[30];
535 if(g_speed_gain > 1) {
536 g_speed_gain--;
537 SetDriveSpeed(g_speed/g_speed_gain);
538 sprintf(str, "Adjust speed gain = %d \r\n", g_speed_gain);
539 uart_PSendString(RC_OUTPUT_PORT, str);
540 }
541}
542
543
544/*
545 * PS3ƒRƒ“ƒgƒ[ƒ‰‚̃AƒiƒƒOƒ{ƒ^ƒ“–ˆ‚̏ˆ—
546 */
547#define PS3ANALOG_MAX 63
548#define PS3ANALOG_MIN -63
549
550/*
551 * ¶ƒAƒiƒƒOƒRƒ“ƒgƒ[ƒ‰‚̍¶‰E“®ì
552 * ƒXƒeƒAƒŠƒ“ƒO‚𑀍ì
553 */
554void
555onPS3AnalogL_LR(void)
556{
557 char str[30];
558 float angle;
559 float cur_analog = p_g_cur_ps3analog[NO_PS3ANALOG_L_LR];
560
561 if ((cur_analog <= PS3ANALOG_MAX) && (cur_analog >= PS3ANALOG_MIN)) {
562 angle = -(cur_analog/2);
563 angle += g_steer_neutral;
564 if (angle != g_angle) {
565 g_angle = angle;
566 SetSteerAngle(g_angle);
567 sprintf(str, "Steer angle = %2.1f\r\n", g_angle);
568 uart_PSendString(RC_OUTPUT_PORT, str);
569 }
570 }
571}
572
573/*
574 * ¶ƒAƒiƒƒOƒRƒ“ƒgƒ[ƒ‰‚̏㉺“®ì
575 */
576void
577onPS3AnalogL_UD(void)
578{
579
580}
581
582/*
583 * ‰EƒAƒiƒƒOƒRƒ“ƒgƒ[ƒ‰‚̍¶‰E“®ì
584 */
585void
586onPS3AnalogR_LR(void)
587{
588
589}
590
591/*
592 * ¶ƒAƒiƒƒOƒRƒ“ƒgƒ[ƒ‰‚̏㉺“®ì
593 */
594void
595onPS3AnalogR_UD(void)
596{
597 float speed = 0;
598 char str[30];
599 float cur_analog = p_g_cur_ps3analog[NO_PS3ANALOG_R_UD];
600
601 /* ƒuƒŒ[ƒLƒ{ƒ^ƒ“‚ª‰Ÿ‚³‚ê‚Ä‚¢‚ê‚΃oƒbƒNƒ‰ƒ“ƒv‚ƃuƒU[‚ðÁ‚· */
602 if (g_isBrake == TRUE) {
603 g_body_cont_info.backlamp = BODY_CONT_OFF;
604 g_body_cont_info.buzzer = BODY_CONT_OFF;
605 return;
606 }
607
608 /* ƒRƒ“ƒgƒ[ƒ‰‚ÌŽi—ß’l‚©‚çƒXƒs[ƒh‚ð‹‚ß‚é */
609 speed = -((cur_analog / 2) * 0.1);
610
611 /* Ži—ß’l‚ɕω»‚ª‚ ‚Á‚½ê‡ */
612 if (g_speed != speed) {
613 float abs_g_speed;
614 float abs_speed;
615
616 /*
617 * ‹^Ž—ƒuƒŒ[ƒLˆ—
618 */
619 /* ‘O‰ñŽi—ß’l‚ƐV‚µ‚¢Ži—ß’l‚̐â‘Î‚ð‹‚ß‚é */
620 abs_g_speed = (g_speed < 0)? -g_speed : g_speed;
621 abs_speed = (speed < 0)? -speed : speed;
622
623 if(abs_g_speed > abs_speed){
624 /* ‘O‰ñŽi—ß’l‚æ‚茸‚Á‚½ê‡‚̓uƒŒ[ƒLƒ‰ƒ“ƒv‚ðON */
625 g_body_cont_info.breaklamp = BODY_CONT_ON;
626 }
627 else {
628 /* ‘O‰ñŽi—ß’l‚æ‚葝‰Á‚µ‚½ê‡‚̓uƒŒ[ƒLƒ‰ƒ“ƒv‚ðOFF */
629 g_body_cont_info.breaklamp = BODY_CONT_OFF;
630 }
631
632 /*
633 * ƒAƒNƒZƒ‹ˆ—
634 */
635 g_speed = speed;
636 SetDriveSpeed(g_speed/g_speed_gain);
637 if (speed < 0){
638 g_body_cont_info.backlamp = BODY_CONT_ON;
639 g_body_cont_info.buzzer = BODY_CONT_BLINK;
640 }
641 else {
642 g_body_cont_info.backlamp = BODY_CONT_OFF;
643 g_body_cont_info.buzzer = BODY_CONT_OFF;
644 }
645
646 sprintf(str, "Drive speed = %1.1f\r\n", speed/g_speed_gain);
647 uart_PSendString(RC_OUTPUT_PORT, str);
648 }
649}
650
651/*
652 * PS3ƒRƒ“ƒgƒ[ƒ‰‚̃fƒWƒ^ƒ‹ƒ{ƒ^ƒ“–ˆ‚̏ˆ—
653 */
654
655#define TOGGLE_ON_OFF(item) item = (item == BODY_CONT_ON)? BODY_CONT_OFF : BODY_CONT_ON;
656
657/*
658 * ~ : ƒuƒŒ[ƒL
659 */
660void
661onPS3ButtonCrossEdgeOn(void) {
662 g_isBrake = TRUE;
663 SetDriveSpeed(0);
664 g_body_cont_info.breaklamp = BODY_CONT_ON;
665}
666
667
668void
669onPS3ButtonCrossEdgeOff(void) {
670 g_isBrake = FALSE;
671 g_body_cont_info.breaklamp = BODY_CONT_OFF;
672}
673
674/*
675 * ¢ : ƒnƒU[ƒh
676 */
677void
678onPS3ButtonTriangleEdgeOn(void) {
679 TOGGLE_ON_OFF(g_body_cont_info.hazardlamp);
680}
681
682void
683onPS3ButtonTriangleEdgeOff(void) {
684
685}
686
687/*
688 * › : ƒƒCƒ“ƒwƒbƒhƒ‰ƒCƒg(ƒwƒbƒhƒ‰ƒCƒg1/ƒwƒbƒhƒ‰ƒCƒg2) Ø‚è‘Ö‚¦
689 */
690void
691onPS3ButtonNoughtEdgeOn(void) {
692 TOGGLE_ON_OFF(g_body_cont_info.headlight1);
693 TOGGLE_ON_OFF(g_body_cont_info.headlight2);
694}
695
696void
697onPS3ButtonNoughtEdgeOff(void) {
698
699}
700
701/*
702 *   : ƒtƒHƒO(ƒwƒbƒhƒ‰ƒCƒg3) Ø‚è‘Ö‚¦
703 */
704void
705onPS3ButtonSquareEdgeOn(void) {
706 TOGGLE_ON_OFF(g_body_cont_info.headlight3);
707}
708
709void
710onPS3ButtonSquareEdgeOff(void) {
711
712}
713
714/*
715 * ¶ƒ{ƒ^ƒ“ : ƒXƒeƒAƒŠƒ“ƒO‚̃jƒ…
716[ƒgƒ‰ƒ‹‚𒲐®
717 */
718void
719onPS3ButtonLeftEdgeOn(void) {
720 AdjustSteerNeturalL();
721 g_body_cont_info.blinker_l = BODY_CONT_ON;
722}
723
724void
725onPS3ButtonLeftEdgeOff(void) {
726 g_body_cont_info.blinker_l = (g_blinker_l_blink)? BODY_CONT_BLINK : BODY_CONT_OFF;
727}
728
729/*
730 * ‰Eƒ{ƒ^ƒ“ : ƒXƒeƒAƒŠƒ“ƒO‚̃jƒ…
731[ƒgƒ‰ƒ‹‚𒲐®
732 */
733void
734onPS3ButtonRightEdgeOn(void) {
735 AdjustSteerNeturalR();
736 g_body_cont_info.blinker_r = BODY_CONT_ON;
737}
738
739void
740onPS3ButtonRightEdgeOff(void) {
741 g_body_cont_info.blinker_r = (g_blinker_r_blink)? BODY_CONT_BLINK : BODY_CONT_OFF;
742}
743
744/*
745 * ãƒ{ƒ^ƒ“ : ƒXƒeƒAƒŠƒ“ƒO‚ðƒjƒ…
746[ƒgƒ‰ƒ‹‚É‚·‚é
747 */
748void
749onPS3ButtonUpEdgeOn(void) {
750 InitSteerNetural();
751 g_body_cont_info.blinker_l = BODY_CONT_ON;
752 g_body_cont_info.blinker_r = BODY_CONT_ON;
753}
754
755void
756onPS3ButtonUpEdgeOff(void) {
757 g_body_cont_info.blinker_l = (g_blinker_l_blink)? BODY_CONT_BLINK : BODY_CONT_OFF;
758 g_body_cont_info.blinker_r = (g_blinker_r_blink)? BODY_CONT_BLINK : BODY_CONT_OFF;
759}
760
761/*
762 * ‰ºƒ{ƒ^ƒ“ : ƒ‚[ƒ^§Œä‚̃QƒCƒ“‚ð‰Šú’l‚É‚·‚é
763 */
764void
765onPS3ButtonDownEdgeOn(void) {
766 char str[30];
767
768 g_speed_gain = MOTOR_GAIN_INIT;
769 SetDriveSpeed(g_speed/g_speed_gain);
770 g_body_cont_info.blinker_l = BODY_CONT_ON;
771 g_body_cont_info.blinker_r = BODY_CONT_ON;
772
773 sprintf(str, "Adjust speed gain = %d \r\n", g_speed_gain);
774 uart_PSendString(RC_OUTPUT_PORT, str);
775}
776
777void
778onPS3ButtonDownEdgeOff(void) {
779 g_body_cont_info.blinker_l = (g_blinker_l_blink)? BODY_CONT_BLINK : BODY_CONT_OFF;
780 g_body_cont_info.blinker_r = (g_blinker_r_blink)? BODY_CONT_BLINK : BODY_CONT_OFF;
781}
782
783
784/*
785 * L1/R1 : •ûŒüŽwŽ¦Ší‚ÌON/OFF
786 */
787void
788onPS3ButtonL1EdgeOn(void){
789 if (g_blinker_l_blink) {
790 g_blinker_l_blink = FALSE;
791 /* ƒ{ƒfƒB[‚Ö‚ÌŽwŽ¦‚ªON‚̏ꍇ‚Í‘¼‚Ì‹@”\‚ªON‚É‚µ‚Ä‚¢‚邽‚߉½‚à‚µ‚È‚¢ */
792 if (!(g_body_cont_info.blinker_l == BODY_CONT_ON)) {
793 g_body_cont_info.blinker_l = BODY_CONT_OFF;
794 }
795 } else {
796 g_blinker_l_blink = TRUE;
797 /* ƒ{ƒfƒB[‚Ö‚ÌŽwŽ¦‚ªON‚̏ꍇ‚Í‘¼‚Ì‹@”\‚ªON‚É‚µ‚Ä‚¢‚邽‚߉½‚à‚µ‚È‚¢ */
798 if (!(g_body_cont_info.blinker_l == BODY_CONT_ON)) {
799 g_body_cont_info.blinker_l = BODY_CONT_BLINK;
800 }
801 }
802}
803
804void
805onPS3ButtonL1EdgeOff(void) {
806
807}
808
809void
810onPS3ButtonR1EdgeOn(void){
811 if (g_blinker_r_blink) {
812 g_blinker_r_blink = FALSE;
813 /* ƒ{ƒfƒB[‚Ö‚ÌŽwŽ¦‚ªON‚̏ꍇ‚Í‘¼‚Ì‹@”\‚ªON‚É‚µ‚Ä‚¢‚邽‚߉½‚à‚µ‚È‚¢ */
814 if (!(g_body_cont_info.blinker_r == BODY_CONT_ON)) {
815 g_body_cont_info.blinker_r = BODY_CONT_OFF;
816 }
817 } else {
818 g_blinker_r_blink = TRUE;
819 /* ƒ{ƒfƒB[‚Ö‚ÌŽwŽ¦‚ªON‚̏ꍇ‚Í‘¼‚Ì‹@”\‚ªON‚É‚µ‚Ä‚¢‚邽‚߉½‚à‚µ‚È‚¢ */
820 if (!(g_body_cont_info.blinker_r == BODY_CONT_ON)) {
821 g_body_cont_info.blinker_r = BODY_CONT_BLINK;
822 }
823 }
824}
825
826void
827onPS3ButtonR1EdgeOff(void) {
828
829}
830
831/*
832 * L2/R2 : ƒ‚[ƒ^§Œä‚̃QƒCƒ“‚ð•ÏX
833 */
834void
835onPS3ButtonL2EdgeOn(void){
836 AdjustSpeedGainD();
837 g_body_cont_info.blinker_l = BODY_CONT_ON;
838}
839
840void
841onPS3ButtonL2EdgeOff(void){
842 g_body_cont_info.blinker_l = (g_blinker_l_blink)? BODY_CONT_BLINK : BODY_CONT_OFF;
843}
844
845void
846onPS3ButtonR2EdgeOn(void){
847 AdjustSpeedGainU();
848 g_body_cont_info.blinker_r = BODY_CONT_ON;
849}
850
851void
852onPS3ButtonR2EdgeOff(void){
853 g_body_cont_info.blinker_r = (g_blinker_r_blink)? BODY_CONT_BLINK : BODY_CONT_OFF;
854}
855
856
857/*
858 * ƒ{ƒ^ƒ“‚̕ω»ŒŸo‚Ì‚½‚߂̃}ƒNƒ
859 */
860#define PS3BUTTON_EDGE_ON(no) ((p_g_pre_ps3button[no] == FALSE) && (p_g_cur_ps3button[no] == TRUE))
861#define PS3BUTTON_EDGE_OFF(no) ((p_g_pre_ps3button[no] == TRUE) && (p_g_cur_ps3button[no] == FALSE))
862#define PS3ANALOG_CHANGE(no) (p_g_pre_ps3analog[no] != p_g_cur_ps3analog[no])
863
864/*
865 * PS3ƒRƒ“ƒgƒ[ƒ‰‚©‚ç‚̃Cƒxƒ“ƒg‚̏ˆ—
866 */
867void
868onMsgPS3(void) {
869 if (PS3BUTTON_EDGE_OFF(NO_PS3BUTTON_CROSS)){
870 onPS3ButtonCrossEdgeOff();
871 }
872 if (PS3BUTTON_EDGE_ON(NO_PS3BUTTON_TRIANGLE)){
873 onPS3ButtonTriangleEdgeOn();
874 }
875 if (PS3BUTTON_EDGE_OFF(NO_PS3BUTTON_TRIANGLE)){
876 onPS3ButtonTriangleEdgeOff();
877 }
878 if (PS3BUTTON_EDGE_ON(NO_PS3BUTTON_NOUGHT)){
879 onPS3ButtonNoughtEdgeOn();
880 }
881 if (PS3BUTTON_EDGE_OFF(NO_PS3BUTTON_NOUGHT)){
882 onPS3ButtonNoughtEdgeOff();
883 }
884 if (PS3BUTTON_EDGE_ON(NO_PS3BUTTON_SQUARE)){
885 onPS3ButtonSquareEdgeOn();
886 }
887 if (PS3BUTTON_EDGE_OFF(NO_PS3BUTTON_SQUARE)){
888 onPS3ButtonSquareEdgeOff();
889 }
890
891
892 if (PS3BUTTON_EDGE_ON(NO_PS3BUTTON_LEFT)){
893 onPS3ButtonLeftEdgeOn();
894 }
895 if (PS3BUTTON_EDGE_OFF(NO_PS3BUTTON_LEFT)){
896 onPS3ButtonLeftEdgeOff();
897 }
898 if (PS3BUTTON_EDGE_ON(NO_PS3BUTTON_RIGHT)){
899 onPS3ButtonRightEdgeOn();
900 }
901 if (PS3BUTTON_EDGE_OFF(NO_PS3BUTTON_RIGHT)){
902 onPS3ButtonRightEdgeOff();
903 }
904 if (PS3BUTTON_EDGE_ON(NO_PS3BUTTON_UP)){
905 onPS3ButtonUpEdgeOn();
906 }
907 if (PS3BUTTON_EDGE_OFF(NO_PS3BUTTON_UP)){
908 onPS3ButtonUpEdgeOff();
909 }
910 if (PS3BUTTON_EDGE_ON(NO_PS3BUTTON_DOWN)){
911 onPS3ButtonDownEdgeOn();
912 }
913 if (PS3BUTTON_EDGE_OFF(NO_PS3BUTTON_DOWN)){
914 onPS3ButtonDownEdgeOff();
915 }
916 if (PS3BUTTON_EDGE_ON(NO_PS3BUTTON_CROSS)){
917 onPS3ButtonCrossEdgeOn();
918 }
919
920
921 if (PS3BUTTON_EDGE_ON(NO_PS3BUTTON_L1)){
922 onPS3ButtonL1EdgeOn();
923 }
924 if (PS3BUTTON_EDGE_ON(NO_PS3BUTTON_R1)){
925 onPS3ButtonR1EdgeOn();
926 }
927
928 if (PS3BUTTON_EDGE_ON(NO_PS3BUTTON_L2)){
929 onPS3ButtonL2EdgeOn();
930 }
931 if (PS3BUTTON_EDGE_OFF(NO_PS3BUTTON_L2)){
932 onPS3ButtonL2EdgeOff();
933 }
934 if (PS3BUTTON_EDGE_ON(NO_PS3BUTTON_R2)){
935 onPS3ButtonR2EdgeOn();
936 }
937 if (PS3BUTTON_EDGE_OFF(NO_PS3BUTTON_R2)){
938 onPS3ButtonR2EdgeOff();
939 }
940 if (PS3ANALOG_CHANGE(NO_PS3ANALOG_L_LR)) {
941 onPS3AnalogL_LR();
942 }
943 if (PS3ANALOG_CHANGE(NO_PS3ANALOG_L_UD)) {
944 onPS3AnalogL_UD();
945 }
946 if (PS3ANALOG_CHANGE(NO_PS3ANALOG_R_LR)) {
947 onPS3AnalogR_LR();
948 }
949 if (PS3ANALOG_CHANGE(NO_PS3ANALOG_R_UD)) {
950 onPS3AnalogR_UD();
951 }
952}
Note: See TracBrowser for help on using the repository browser.