yusei sugimoeo / Mbed OS controllerForMbed_test_Re
Committer:
e5119053f6
Date:
Tue Sep 06 06:07:56 2022 +0000
Revision:
2:507b31207449
Parent:
0:4f5b9889cbc4
controller

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kikuchi8810 0:4f5b9889cbc4 1 #include "Controller.h"
kikuchi8810 0:4f5b9889cbc4 2
kikuchi8810 0:4f5b9889cbc4 3 Controller::Controller(PinName tx, PinName rx, int baudrate) : serial(tx, rx, baudrate)
kikuchi8810 0:4f5b9889cbc4 4 {
kikuchi8810 0:4f5b9889cbc4 5 conData.ButtonState = 0;
kikuchi8810 0:4f5b9889cbc4 6 conData.RJoyX = 127, conData.RJoyY = 127, conData.LJoyX = 127, conData.LJoyY = 127;
kikuchi8810 0:4f5b9889cbc4 7
kikuchi8810 0:4f5b9889cbc4 8 lastButtonState = 0;
kikuchi8810 0:4f5b9889cbc4 9
kikuchi8810 0:4f5b9889cbc4 10 comCheck = false;
kikuchi8810 0:4f5b9889cbc4 11 conAvailable = false;
kikuchi8810 0:4f5b9889cbc4 12 time_out_ms = -1;
kikuchi8810 0:4f5b9889cbc4 13 }
kikuchi8810 0:4f5b9889cbc4 14
kikuchi8810 0:4f5b9889cbc4 15 void Controller::init(int _time_out_ms, int _int_time_ms)
kikuchi8810 0:4f5b9889cbc4 16 {
kikuchi8810 0:4f5b9889cbc4 17 time_out_ms = _time_out_ms;
kikuchi8810 0:4f5b9889cbc4 18 int_time_ms = _int_time_ms;
kikuchi8810 0:4f5b9889cbc4 19 //serial.attach(this, &Controller::update, Serial::RxIrq);
kikuchi8810 0:4f5b9889cbc4 20 //timer.start();
kikuchi8810 0:4f5b9889cbc4 21 }
kikuchi8810 0:4f5b9889cbc4 22
kikuchi8810 0:4f5b9889cbc4 23 bool Controller::update()
kikuchi8810 0:4f5b9889cbc4 24 {
kikuchi8810 0:4f5b9889cbc4 25 //receptionTime = timer.read();
kikuchi8810 0:4f5b9889cbc4 26 static int count_ms = time_out_ms, pre_count_ms = 0; //受信時刻と前回の受信時刻
kikuchi8810 0:4f5b9889cbc4 27 count_ms += int_time_ms;
kikuchi8810 0:4f5b9889cbc4 28
kikuchi8810 0:4f5b9889cbc4 29 char receive_data[10];
kikuchi8810 0:4f5b9889cbc4 30 unsigned int loop_count = 0, checksum = 0x00;
kikuchi8810 0:4f5b9889cbc4 31 comCheck = false;
kikuchi8810 0:4f5b9889cbc4 32
kikuchi8810 0:4f5b9889cbc4 33 #if CON_TYPE == CON_ADACHI // 安達君開発のコントローラを使う場合の処理(どのコントローラを使うかはdefine.hで設定)
e5119053f6 2:507b31207449 34 while (loop_count < 10 && serial.readable()) {
e5119053f6 2:507b31207449 35 if (serial_recieve() == '\n') {
kikuchi8810 0:4f5b9889cbc4 36 for (int i = 0; i < 8; i++)
kikuchi8810 0:4f5b9889cbc4 37 receive_data[i] = serial_recieve();
kikuchi8810 0:4f5b9889cbc4 38 for (int i = 0; i < 8; i++)
kikuchi8810 0:4f5b9889cbc4 39 receive_data[i] -= 0x20;
kikuchi8810 0:4f5b9889cbc4 40 for (int i = 0; i < 7; i++)
kikuchi8810 0:4f5b9889cbc4 41 checksum ^= receive_data[i];
kikuchi8810 0:4f5b9889cbc4 42
e5119053f6 2:507b31207449 43 if (receive_data[7] == checksum & 0xFF) {
kikuchi8810 0:4f5b9889cbc4 44 comCheck = true;
kikuchi8810 0:4f5b9889cbc4 45
kikuchi8810 0:4f5b9889cbc4 46 //pre_conData.ButtonState = conData.ButtonState;
kikuchi8810 0:4f5b9889cbc4 47 lastButtonState = ((receive_data[0] & 0x3F) << 2) | ((receive_data[1] & 0x30) >> 4);
kikuchi8810 0:4f5b9889cbc4 48 conData.ButtonState |= lastButtonState;
kikuchi8810 0:4f5b9889cbc4 49
kikuchi8810 0:4f5b9889cbc4 50 conData.RJoyX = ((receive_data[1] & 0x0F) << 4) | ((receive_data[2] & 0x3C) >> 2);
kikuchi8810 0:4f5b9889cbc4 51 conData.RJoyY = ((receive_data[2] & 0x03) << 6) | (receive_data[3] & 0x3F);
kikuchi8810 0:4f5b9889cbc4 52 conData.LJoyX = ((receive_data[4] & 0x3F) << 2) | ((receive_data[5] & 0x30) >> 4);
kikuchi8810 0:4f5b9889cbc4 53 conData.LJoyY = ((receive_data[5] & 0x0F) << 4) | (receive_data[6] & 0x0F);
kikuchi8810 0:4f5b9889cbc4 54
kikuchi8810 0:4f5b9889cbc4 55 break;
kikuchi8810 0:4f5b9889cbc4 56 }
e5119053f6 2:507b31207449 57
kikuchi8810 0:4f5b9889cbc4 58 pre_count_ms = count_ms; //受信時間の更新
kikuchi8810 0:4f5b9889cbc4 59 }
kikuchi8810 0:4f5b9889cbc4 60 loop_count++;
kikuchi8810 0:4f5b9889cbc4 61 }
kikuchi8810 0:4f5b9889cbc4 62 #elif CON_TYPE == CON_ELECOM // ELECOMのコントローラを使う場合の処理(どのコントローラを使うかはdefine.hで設定)
kikuchi8810 0:4f5b9889cbc4 63 // コントローラデータを取得する部分
kikuchi8810 0:4f5b9889cbc4 64 static int recv_num = 0;
kikuchi8810 0:4f5b9889cbc4 65 char c;
e5119053f6 2:507b31207449 66 while (serial.readable()) {
kikuchi8810 0:4f5b9889cbc4 67 c = serial.getc();
e5119053f6 2:507b31207449 68 if (c == '\n') {
e5119053f6 2:507b31207449 69 if (recv_num == 10) {
e5119053f6 2:507b31207449 70 // チェックサムは無く,9個受信したら値を格納
kikuchi8810 0:4f5b9889cbc4 71 for (int i = 0; i < 9; i++)
kikuchi8810 0:4f5b9889cbc4 72 checksum += (unsigned int)(receive_data[i] - 0x20); // チェックサムの計算
e5119053f6 2:507b31207449 73 if ((checksum & 0x3F) == (receive_data[9] - 0x20)) {
e5119053f6 2:507b31207449 74 // チェックサムの計算が合っていた場合のみ値を格納
kikuchi8810 0:4f5b9889cbc4 75 comCheck = true;
kikuchi8810 0:4f5b9889cbc4 76
kikuchi8810 0:4f5b9889cbc4 77 //conData.ButtonState = 0;
kikuchi8810 0:4f5b9889cbc4 78 conData.LJoyX = 0, conData.LJoyY = 0, conData.RJoyX = 0, conData.RJoyY = 0;
kikuchi8810 0:4f5b9889cbc4 79 lastButtonState = (unsigned int)(receive_data[0] - 0x20);
kikuchi8810 0:4f5b9889cbc4 80 lastButtonState |= (unsigned int)(receive_data[1] - 0x20) << 6;
kikuchi8810 0:4f5b9889cbc4 81 lastButtonState |= (unsigned int)(receive_data[2] - 0x20) << 12;
kikuchi8810 0:4f5b9889cbc4 82
kikuchi8810 0:4f5b9889cbc4 83 conData.LJoyX |= (unsigned int)(receive_data[3] - 0x20);
kikuchi8810 0:4f5b9889cbc4 84 conData.LJoyX |= (unsigned int)((receive_data[4] - 0x20) & 0x03) << 6;
kikuchi8810 0:4f5b9889cbc4 85 conData.LJoyX = abs(conData.LJoyX - 0xFF);
kikuchi8810 0:4f5b9889cbc4 86
kikuchi8810 0:4f5b9889cbc4 87 conData.LJoyY |= (unsigned int)((receive_data[4] - 0x20) & 0x3C) >> 2;
kikuchi8810 0:4f5b9889cbc4 88 conData.LJoyY |= (unsigned int)((receive_data[5] - 0x20) & 0x0F) << 4;
kikuchi8810 0:4f5b9889cbc4 89 conData.LJoyY = abs(conData.LJoyY - 0xFF);
kikuchi8810 0:4f5b9889cbc4 90
kikuchi8810 0:4f5b9889cbc4 91 conData.RJoyX |= (unsigned int)((receive_data[5] - 0x20) & 0x30) >> 4;
kikuchi8810 0:4f5b9889cbc4 92 conData.RJoyX |= (unsigned int)((receive_data[6] - 0x20) & 0x3F) << 2;
kikuchi8810 0:4f5b9889cbc4 93 conData.RJoyX = abs(conData.RJoyX - 0xFF);
kikuchi8810 0:4f5b9889cbc4 94
kikuchi8810 0:4f5b9889cbc4 95 conData.RJoyY |= (unsigned int)(receive_data[7] - 0x20);
kikuchi8810 0:4f5b9889cbc4 96 conData.RJoyY |= (unsigned int)((receive_data[8] - 0x20) & 0x03) << 6;
kikuchi8810 0:4f5b9889cbc4 97 conData.RJoyY = abs(conData.RJoyY - 0xFF);
kikuchi8810 0:4f5b9889cbc4 98
kikuchi8810 0:4f5b9889cbc4 99 int buttonPushNum = 0;
e5119053f6 2:507b31207449 100 for (int i = 0; i < 16; i++) {
kikuchi8810 0:4f5b9889cbc4 101 buttonPushNum += (conData.ButtonState >> i) & 0x0001;
kikuchi8810 0:4f5b9889cbc4 102 }
e5119053f6 2:507b31207449 103 if (buttonPushNum > 5) {
kikuchi8810 0:4f5b9889cbc4 104 //conData.ButtonState = pre_conData.ButtonState;
kikuchi8810 0:4f5b9889cbc4 105 comCheck = false;
e5119053f6 2:507b31207449 106 } else {
kikuchi8810 0:4f5b9889cbc4 107 conData.ButtonState |= lastButtonState;
kikuchi8810 0:4f5b9889cbc4 108 }
e5119053f6 2:507b31207449 109
kikuchi8810 0:4f5b9889cbc4 110 pre_count_ms = count_ms; //受信時間の更新
kikuchi8810 0:4f5b9889cbc4 111 }
kikuchi8810 0:4f5b9889cbc4 112 }
kikuchi8810 0:4f5b9889cbc4 113 recv_num = 0;
e5119053f6 2:507b31207449 114 } else {
kikuchi8810 0:4f5b9889cbc4 115 receive_data[recv_num] = c;
kikuchi8810 0:4f5b9889cbc4 116 recv_num++;
kikuchi8810 0:4f5b9889cbc4 117 }
kikuchi8810 0:4f5b9889cbc4 118 }
kikuchi8810 0:4f5b9889cbc4 119 #elif CON_TYPE == CON_DS4 // DualShock4を使う場合の処理(どのコントローラを使うかはdefine.hで設定)
kikuchi8810 0:4f5b9889cbc4 120 // コントローラデータを取得する部分
kikuchi8810 0:4f5b9889cbc4 121 static int recv_num = 0;
kikuchi8810 0:4f5b9889cbc4 122 char c;
e5119053f6 2:507b31207449 123 while (serial.readable()) {
kikuchi8810 0:4f5b9889cbc4 124 c = serial.getc();
e5119053f6 2:507b31207449 125 //printf("%x ",c);
e5119053f6 2:507b31207449 126
e5119053f6 2:507b31207449 127 if (c == '\n') {
e5119053f6 2:507b31207449 128 //printf("\t");
e5119053f6 2:507b31207449 129 if (recv_num == 10) {
e5119053f6 2:507b31207449 130 // データ数はチェックサム含めて10個(0~9)
kikuchi8810 0:4f5b9889cbc4 131 checksum = 0;
e5119053f6 2:507b31207449 132 //for(int i = 0; i<10; i++)printf("%+x ",receive_data[i]);
e5119053f6 2:507b31207449 133 for (int i = 0; i < 9; i++)checksum ^= (unsigned int)(receive_data[i] - 0x20); // チェックサムの計算
e5119053f6 2:507b31207449 134 //printf(" %+x\n",checksum);
e5119053f6 2:507b31207449 135 if ((checksum & 0x3F) == (receive_data[9] - 0x20)) {
e5119053f6 2:507b31207449 136 // チェックサムの計算が合っていた場合のみ値を格納
e5119053f6 2:507b31207449 137 //printf("checksum ok \n");
kikuchi8810 0:4f5b9889cbc4 138 comCheck = true;
kikuchi8810 0:4f5b9889cbc4 139
kikuchi8810 0:4f5b9889cbc4 140 //conData.ButtonState = 0;
kikuchi8810 0:4f5b9889cbc4 141 conData.LJoyX = 0, conData.LJoyY = 0, conData.RJoyX = 0, conData.RJoyY = 0;
kikuchi8810 0:4f5b9889cbc4 142 lastButtonState = (unsigned int)(receive_data[0] - 0x20) & 0x3F;
kikuchi8810 0:4f5b9889cbc4 143 lastButtonState |= (unsigned int)((receive_data[1] - 0x20) & 0x3F) << 6;
kikuchi8810 0:4f5b9889cbc4 144 lastButtonState |= (unsigned int)((receive_data[2] - 0x20) & 0x0F) << 12;
kikuchi8810 0:4f5b9889cbc4 145
e5119053f6 2:507b31207449 146 conData.LJoyX |= (unsigned int)(receive_data[3] - 0x20) & 0x3F;
kikuchi8810 0:4f5b9889cbc4 147 conData.LJoyX |= (unsigned int)((receive_data[4] - 0x20) & 0x03) << 6;
kikuchi8810 0:4f5b9889cbc4 148 conData.LJoyX = abs(conData.LJoyX - 0xFF);
kikuchi8810 0:4f5b9889cbc4 149
kikuchi8810 0:4f5b9889cbc4 150 conData.LJoyY |= (unsigned int)((receive_data[4] - 0x20) & 0x3C) >> 2;
kikuchi8810 0:4f5b9889cbc4 151 conData.LJoyY |= (unsigned int)((receive_data[5] - 0x20) & 0x0F) << 4;
kikuchi8810 0:4f5b9889cbc4 152 conData.LJoyY = abs(conData.LJoyY - 0xFF);
kikuchi8810 0:4f5b9889cbc4 153
kikuchi8810 0:4f5b9889cbc4 154 conData.RJoyX |= (unsigned int)((receive_data[5] - 0x20) & 0x30) >> 4;
kikuchi8810 0:4f5b9889cbc4 155 conData.RJoyX |= (unsigned int)((receive_data[6] - 0x20) & 0x3F) << 2;
kikuchi8810 0:4f5b9889cbc4 156 conData.RJoyX = abs(conData.RJoyX - 0xFF);
kikuchi8810 0:4f5b9889cbc4 157
e5119053f6 2:507b31207449 158 conData.RJoyY |= (unsigned int)(receive_data[7] - 0x20) & 0x3F;
kikuchi8810 0:4f5b9889cbc4 159 conData.RJoyY |= (unsigned int)((receive_data[8] - 0x20) & 0x03) << 6;
kikuchi8810 0:4f5b9889cbc4 160 conData.RJoyY = abs(conData.RJoyY - 0xFF);
kikuchi8810 0:4f5b9889cbc4 161
kikuchi8810 0:4f5b9889cbc4 162 // 通信ミスであり得ない数のボタン数押されていた場合に無視する処理
kikuchi8810 0:4f5b9889cbc4 163 int buttonPushNum = 0;
e5119053f6 2:507b31207449 164 for (int i = 0; i < 16; i++) {
kikuchi8810 0:4f5b9889cbc4 165 buttonPushNum += (lastButtonState >> i) & 0x0001;
kikuchi8810 0:4f5b9889cbc4 166 }
e5119053f6 2:507b31207449 167 if (buttonPushNum > 5) {
kikuchi8810 0:4f5b9889cbc4 168 //conData.ButtonState = pre_conData.ButtonState;
kikuchi8810 0:4f5b9889cbc4 169 comCheck = false;
e5119053f6 2:507b31207449 170 } else {
kikuchi8810 0:4f5b9889cbc4 171 conData.ButtonState = lastButtonState & 0xFFFF;
kikuchi8810 0:4f5b9889cbc4 172 }
kikuchi8810 0:4f5b9889cbc4 173
kikuchi8810 0:4f5b9889cbc4 174 pre_count_ms = count_ms; //受信時間の更新
kikuchi8810 0:4f5b9889cbc4 175 }
kikuchi8810 0:4f5b9889cbc4 176 }
kikuchi8810 0:4f5b9889cbc4 177 recv_num = 0;
e5119053f6 2:507b31207449 178 } else {
kikuchi8810 0:4f5b9889cbc4 179 receive_data[recv_num] = c;
kikuchi8810 0:4f5b9889cbc4 180 recv_num++;
kikuchi8810 0:4f5b9889cbc4 181 }
e5119053f6 2:507b31207449 182 //printf("con\n");
kikuchi8810 0:4f5b9889cbc4 183 }
e5119053f6 2:507b31207449 184 //printf("nuketa\n");
kikuchi8810 0:4f5b9889cbc4 185
kikuchi8810 0:4f5b9889cbc4 186 #endif
e5119053f6 2:507b31207449 187 //printf("g1");
kikuchi8810 0:4f5b9889cbc4 188 if(!(time_out_ms == -1)) conAvailable = (time_out_ms > (count_ms - pre_count_ms)); //タイムアウトとインターバルの比較
kikuchi8810 0:4f5b9889cbc4 189 else conAvailable = true;
e5119053f6 2:507b31207449 190 //printf("g2");
kikuchi8810 0:4f5b9889cbc4 191 if(count_ms > time_out_ms * 1000) count_ms = time_out_ms; //オーバーフロー対策
e5119053f6 2:507b31207449 192 //printf("h");
kikuchi8810 0:4f5b9889cbc4 193 return comCheck;
kikuchi8810 0:4f5b9889cbc4 194 }
kikuchi8810 0:4f5b9889cbc4 195
kikuchi8810 0:4f5b9889cbc4 196 bool Controller::getComCheck(void)
kikuchi8810 0:4f5b9889cbc4 197 {
kikuchi8810 0:4f5b9889cbc4 198 return comCheck;
kikuchi8810 0:4f5b9889cbc4 199 }
kikuchi8810 0:4f5b9889cbc4 200
kikuchi8810 0:4f5b9889cbc4 201 bool Controller::available(void)
kikuchi8810 0:4f5b9889cbc4 202 {
kikuchi8810 0:4f5b9889cbc4 203 return conAvailable;
kikuchi8810 0:4f5b9889cbc4 204 }
kikuchi8810 0:4f5b9889cbc4 205
e5119053f6 2:507b31207449 206 bool Controller::clearBuffer(void)
e5119053f6 2:507b31207449 207 {
e5119053f6 2:507b31207449 208 if(serial.readable()) serial.getc();
e5119053f6 2:507b31207449 209 return serial.readable();
e5119053f6 2:507b31207449 210 }
e5119053f6 2:507b31207449 211
e5119053f6 2:507b31207449 212 bool Controller::rate(void)
e5119053f6 2:507b31207449 213 {
e5119053f6 2:507b31207449 214 bool _ButtunState = false, _RX = false, _RY = false, _LX = false, _LY = false ;
e5119053f6 2:507b31207449 215 if(comCheck) {
e5119053f6 2:507b31207449 216 _ButtunState = (conData.ButtonState != 0)? true : false;
e5119053f6 2:507b31207449 217 _RX = (conData.RJoyX != 128)? true : false;
e5119053f6 2:507b31207449 218 _RY = (conData.RJoyY != 128)? true : false;
e5119053f6 2:507b31207449 219 _LX = (conData.LJoyX != 128)? true : false;
e5119053f6 2:507b31207449 220 _LY = (conData.LJoyY != 128)? true : false;
e5119053f6 2:507b31207449 221 }
e5119053f6 2:507b31207449 222 //printf("%d,%d,%d,%d,%d\n",_ButtunState,_RX,_RY,_LX,_LY);
e5119053f6 2:507b31207449 223 return _ButtunState | _RX | _RY | _LX | _LY;
e5119053f6 2:507b31207449 224 }
e5119053f6 2:507b31207449 225
kikuchi8810 0:4f5b9889cbc4 226 bool Controller::readButton_bin(unsigned int ButtonNum)
e5119053f6 2:507b31207449 227 {
e5119053f6 2:507b31207449 228 //放しているときは0,押しているときは1
kikuchi8810 0:4f5b9889cbc4 229 return ((conData.ButtonState & (0x0001 << (ButtonNum - 1))) == (0x0001 << (ButtonNum - 1))) ? true : false;
kikuchi8810 0:4f5b9889cbc4 230 }
kikuchi8810 0:4f5b9889cbc4 231
kikuchi8810 0:4f5b9889cbc4 232 int Controller::readButton(unsigned int ButtonNum)
e5119053f6 2:507b31207449 233 {
e5119053f6 2:507b31207449 234 //放しているときは0,押しているときは1,押した瞬間は2,放した瞬間は-1
kikuchi8810 0:4f5b9889cbc4 235 int result = 0;
kikuchi8810 0:4f5b9889cbc4 236 if ((conData.ButtonState & (0x0001 << (ButtonNum - 1))) == (0x0001 << (ButtonNum - 1)))
kikuchi8810 0:4f5b9889cbc4 237 result += 2;
kikuchi8810 0:4f5b9889cbc4 238 if ((pre_conData.ButtonState & (0x0001 << (ButtonNum - 1))) == (0x0001 << (ButtonNum - 1)))
kikuchi8810 0:4f5b9889cbc4 239 result -= 1;
kikuchi8810 0:4f5b9889cbc4 240 return result;
kikuchi8810 0:4f5b9889cbc4 241 }
kikuchi8810 0:4f5b9889cbc4 242
kikuchi8810 0:4f5b9889cbc4 243 unsigned int Controller::getButtonState()
kikuchi8810 0:4f5b9889cbc4 244 {
kikuchi8810 0:4f5b9889cbc4 245 return conData.ButtonState;
kikuchi8810 0:4f5b9889cbc4 246 }
kikuchi8810 0:4f5b9889cbc4 247
kikuchi8810 0:4f5b9889cbc4 248 void Controller::clearButtonState()
kikuchi8810 0:4f5b9889cbc4 249 {
kikuchi8810 0:4f5b9889cbc4 250 pre_conData.ButtonState = conData.ButtonState;
kikuchi8810 0:4f5b9889cbc4 251 }
kikuchi8810 0:4f5b9889cbc4 252
kikuchi8810 0:4f5b9889cbc4 253 ControllerData Controller::getConData()
kikuchi8810 0:4f5b9889cbc4 254 {
kikuchi8810 0:4f5b9889cbc4 255 return conData;
kikuchi8810 0:4f5b9889cbc4 256 }
kikuchi8810 0:4f5b9889cbc4 257
kikuchi8810 0:4f5b9889cbc4 258 double Controller::readJoyRX()
kikuchi8810 0:4f5b9889cbc4 259 {
kikuchi8810 0:4f5b9889cbc4 260 if (conData.RJoyX == 127)
kikuchi8810 0:4f5b9889cbc4 261 return 0;
kikuchi8810 0:4f5b9889cbc4 262 return ((double)conData.RJoyX - 127.5) / 127.5;
kikuchi8810 0:4f5b9889cbc4 263 }
kikuchi8810 0:4f5b9889cbc4 264
kikuchi8810 0:4f5b9889cbc4 265 double Controller::readJoyRY()
kikuchi8810 0:4f5b9889cbc4 266 {
kikuchi8810 0:4f5b9889cbc4 267 if (conData.RJoyY == 127)
kikuchi8810 0:4f5b9889cbc4 268 return 0;
kikuchi8810 0:4f5b9889cbc4 269 return ((double)conData.RJoyY - 127.5) / 127.5;
kikuchi8810 0:4f5b9889cbc4 270 }
kikuchi8810 0:4f5b9889cbc4 271
kikuchi8810 0:4f5b9889cbc4 272 double Controller::readJoyLX()
kikuchi8810 0:4f5b9889cbc4 273 {
kikuchi8810 0:4f5b9889cbc4 274 if (conData.LJoyX == 127)
kikuchi8810 0:4f5b9889cbc4 275 return 0;
kikuchi8810 0:4f5b9889cbc4 276 return ((double)conData.LJoyX - 127.5) / 127.5;
kikuchi8810 0:4f5b9889cbc4 277 }
kikuchi8810 0:4f5b9889cbc4 278
kikuchi8810 0:4f5b9889cbc4 279 double Controller::readJoyLY()
kikuchi8810 0:4f5b9889cbc4 280 {
kikuchi8810 0:4f5b9889cbc4 281 if (conData.LJoyY == 127)
kikuchi8810 0:4f5b9889cbc4 282 return 0;
kikuchi8810 0:4f5b9889cbc4 283 return ((double)conData.LJoyY - 127.5) / 127.5;
kikuchi8810 0:4f5b9889cbc4 284 }
kikuchi8810 0:4f5b9889cbc4 285
kikuchi8810 0:4f5b9889cbc4 286 uint8_t Controller::readJoyRXbyte()
kikuchi8810 0:4f5b9889cbc4 287 {
kikuchi8810 0:4f5b9889cbc4 288 return conData.RJoyX;
kikuchi8810 0:4f5b9889cbc4 289 }
kikuchi8810 0:4f5b9889cbc4 290
kikuchi8810 0:4f5b9889cbc4 291 uint8_t Controller::readJoyRYbyte()
kikuchi8810 0:4f5b9889cbc4 292 {
kikuchi8810 0:4f5b9889cbc4 293 return conData.RJoyY;
kikuchi8810 0:4f5b9889cbc4 294 }
kikuchi8810 0:4f5b9889cbc4 295
kikuchi8810 0:4f5b9889cbc4 296 uint8_t Controller::readJoyLXbyte()
kikuchi8810 0:4f5b9889cbc4 297 {
kikuchi8810 0:4f5b9889cbc4 298 return conData.LJoyX;
kikuchi8810 0:4f5b9889cbc4 299 }
kikuchi8810 0:4f5b9889cbc4 300
kikuchi8810 0:4f5b9889cbc4 301 uint8_t Controller::readJoyLYbyte()
kikuchi8810 0:4f5b9889cbc4 302 {
kikuchi8810 0:4f5b9889cbc4 303 return conData.LJoyY;
kikuchi8810 0:4f5b9889cbc4 304 }
kikuchi8810 0:4f5b9889cbc4 305
kikuchi8810 0:4f5b9889cbc4 306 unsigned int Controller::getButtonFlagRise()
kikuchi8810 0:4f5b9889cbc4 307 {
kikuchi8810 0:4f5b9889cbc4 308 // 立ち上がり,立下りのフラッギング処理 (フラグクリアは別関数で)
kikuchi8810 0:4f5b9889cbc4 309 unsigned int buttonFlagRise = 0;
e5119053f6 2:507b31207449 310 if (pre_conData.ButtonState != conData.ButtonState) {
e5119053f6 2:507b31207449 311 for (int i = 0; i < 16; i++) {
kikuchi8810 0:4f5b9889cbc4 312 int mask = 0x01 << i;
e5119053f6 2:507b31207449 313 if ((conData.ButtonState & mask) != (pre_conData.ButtonState & mask)) {
kikuchi8810 0:4f5b9889cbc4 314 if ((conData.ButtonState & mask) == mask)
kikuchi8810 0:4f5b9889cbc4 315 buttonFlagRise |= (conData.ButtonState & mask);
kikuchi8810 0:4f5b9889cbc4 316 }
kikuchi8810 0:4f5b9889cbc4 317 }
kikuchi8810 0:4f5b9889cbc4 318 }
kikuchi8810 0:4f5b9889cbc4 319 return buttonFlagRise;
kikuchi8810 0:4f5b9889cbc4 320 }
kikuchi8810 0:4f5b9889cbc4 321
kikuchi8810 0:4f5b9889cbc4 322 unsigned int Controller::getButtonFlagFall()
kikuchi8810 0:4f5b9889cbc4 323 {
kikuchi8810 0:4f5b9889cbc4 324 unsigned int buttonFlagFall = 0;
e5119053f6 2:507b31207449 325 if (pre_conData.ButtonState != conData.ButtonState) {
e5119053f6 2:507b31207449 326 for (int i = 0; i < 16; i++) {
kikuchi8810 0:4f5b9889cbc4 327 int mask = 0x01 << i;
e5119053f6 2:507b31207449 328 if ((conData.ButtonState & mask) != (pre_conData.ButtonState & mask)) {
kikuchi8810 0:4f5b9889cbc4 329 if ((pre_conData.ButtonState & mask) == mask)
kikuchi8810 0:4f5b9889cbc4 330 buttonFlagFall |= (pre_conData.ButtonState & mask);
kikuchi8810 0:4f5b9889cbc4 331 }
kikuchi8810 0:4f5b9889cbc4 332 }
kikuchi8810 0:4f5b9889cbc4 333 }
kikuchi8810 0:4f5b9889cbc4 334 return buttonFlagFall;
e5119053f6 2:507b31207449 335 }