[128] | 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 | * PS3Rg[Ì{^Ì
|
---|
| 13 | */
|
---|
| 14 | #define PS3_NUM_OF_BUTTON 14
|
---|
| 15 | #define PS3_NUM_OF_ANALOG 4
|
---|
| 16 |
|
---|
| 17 |
|
---|
| 18 | /*
|
---|
| 19 | * d¶tH[}bgÌ^Cv
|
---|
| 20 | */
|
---|
| 21 | enum 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 | * óMbZ[WðÍpO[oÏ
|
---|
| 34 | */
|
---|
| 35 | static enum rcb3_st s_rcb3_st = RCB3_ST_HEADER_1;
|
---|
| 36 | static int s_rcb3_rmsg_cnt;
|
---|
| 37 | uint8 g_rcb3_rmsg[RCB3_MSG_LEN];
|
---|
| 38 |
|
---|
| 39 | /*
|
---|
| 40 | * {^bZ[W»ÊpO[oÏ
|
---|
| 41 | */
|
---|
| 42 | static 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 | * {^óÔÛpO[oÏ
|
---|
| 61 | * _uobt@ƵÄOóÔÆ»ÝóÔðÛ¶·é
|
---|
| 62 | */
|
---|
| 63 | static boolean s_ps3button[2][PS3_NUM_OF_BUTTON];
|
---|
| 64 | static sint8 s_ps3analog[2][PS3_NUM_OF_ANALOG];
|
---|
| 65 |
|
---|
| 66 | /*
|
---|
| 67 | * OóÔÆ»ÝóÔð¦·|C^
|
---|
| 68 | */
|
---|
| 69 | boolean *p_g_pre_ps3button;
|
---|
| 70 | boolean *p_g_cur_ps3button;
|
---|
| 71 | sint8 *p_g_pre_ps3analog;
|
---|
| 72 | sint8 *p_g_cur_ps3analog;
|
---|
| 73 |
|
---|
| 74 |
|
---|
| 75 | void
|
---|
| 76 | rcb3_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 | * {^îñÍ2oCgÆÈÁÄ¢é½ß2oCgf[^ƵÄß·
|
---|
| 89 | */
|
---|
| 90 | static uint16
|
---|
| 91 | rcb3_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 | * {^óÔÌXV
|
---|
| 102 | */
|
---|
| 103 | static void
|
---|
| 104 | rcb3_UpdateStatus(void)
|
---|
| 105 | {
|
---|
| 106 | boolean *tmp_button;
|
---|
| 107 | sint8 *tmp_analog;
|
---|
| 108 | int i;
|
---|
| 109 | uint16 button = rcb3_GetReceivedButton();
|
---|
| 110 |
|
---|
| 111 | /*
|
---|
| 112 | * OóÔÆ»ÝóÔÌ|C^ðXV
|
---|
| 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 | * »ÝÌfW^{^ÌóÔðXV
|
---|
| 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 | * »ÝÌAiO{^ÌóÔðXV
|
---|
| 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 | * RCB3R}hÌðÍ
|
---|
| 146 | *
|
---|
| 147 | * óMµ½1oCgÉøÉwèµÄÄÑo·D
|
---|
| 148 | * d¶ÌÅãÅTRUEðÔ·D
|
---|
| 149 | */
|
---|
| 150 | boolean
|
---|
| 151 | rcb3_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 | }
|
---|