Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of PS4 by
PS4.cpp@9:b98be6c2f23e, 2017-12-11 (annotated)
- Committer:
- Suzutomo
- Date:
- Mon Dec 11 09:07:06 2017 +0000
- Revision:
- 9:b98be6c2f23e
- Parent:
- 8:73810fa167a8
- Child:
- 10:c961d228b63e
Serial connection for PS4
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| Suzutomo | 6:0b7476f64352 | 1 | #include "PS4.h" |
| yopcyuuu | 0:51d821ea634c | 2 | |
| Suzutomo | 9:b98be6c2f23e | 3 | PS4::PS4(RawSerial *i) |
| yopcyuuu | 3:c1318581351c | 4 | { |
| Suzutomo | 8:73810fa167a8 | 5 | serial = i; |
| Suzutomo | 8:73810fa167a8 | 6 | serial->baud(115200); |
| Suzutomo | 9:b98be6c2f23e | 7 | for(int i=0; i<16; i++) { |
| Suzutomo | 9:b98be6c2f23e | 8 | BUTTON_OLD[i] = 0; |
| Suzutomo | 9:b98be6c2f23e | 9 | BUTTON_NEW[i] = 0; |
| yopcyuuu | 0:51d821ea634c | 10 | } |
| yopcyuuu | 0:51d821ea634c | 11 | } |
| yopcyuuu | 0:51d821ea634c | 12 | |
| Suzutomo | 9:b98be6c2f23e | 13 | /*bool PS4::UpDate() |
| yopcyuuu | 0:51d821ea634c | 14 | { |
| Suzutomo | 8:73810fa167a8 | 15 | |
| yopcyuuu | 0:51d821ea634c | 16 | //Make backup |
| yopcyuuu | 0:51d821ea634c | 17 | memcpy( DATA_CONTROLLER_OLD, DATA_CONTROLLER, sizeof(DATA_CONTROLLER) ); |
| yopcyuuu | 0:51d821ea634c | 18 | |
| yopcyuuu | 0:51d821ea634c | 19 | //Get data by I2C |
| Suzutomo | 8:73810fa167a8 | 20 | //int s = i2c->read((ADDR | 1), data, 17); |
| Suzutomo | 8:73810fa167a8 | 21 | if (serial->getc() == 0x80) { |
| Suzutomo | 9:b98be6c2f23e | 22 | for (int i = 0; i<9; i++) { |
| Suzutomo | 8:73810fa167a8 | 23 | data[i] = serial->getc(); |
| Suzutomo | 8:73810fa167a8 | 24 | } |
| Suzutomo | 8:73810fa167a8 | 25 | } |
| Suzutomo | 9:b98be6c2f23e | 26 | if(1) { |
| yopcyuuu | 0:51d821ea634c | 27 | |
| yopcyuuu | 4:cfef9ff2d209 | 28 | //UpDate |
| Suzutomo | 7:ffa4066a789d | 29 | DATA_CONTROLLER[CONNECTION] = (data[0] >> 0) & 0x01; |
| Suzutomo | 7:ffa4066a789d | 30 | DATA_CONTROLLER[UP] = (data[1] >> 7) & 0x01; |
| Suzutomo | 7:ffa4066a789d | 31 | DATA_CONTROLLER[RIGHT] = (data[1] >> 6) & 0x01; |
| Suzutomo | 7:ffa4066a789d | 32 | DATA_CONTROLLER[DOWN] = (data[1] >> 5) & 0x01; |
| Suzutomo | 7:ffa4066a789d | 33 | DATA_CONTROLLER[LEFT] = (data[1] >> 4) & 0x01; |
| Suzutomo | 7:ffa4066a789d | 34 | DATA_CONTROLLER[TRIANGLE] = (data[1] >> 3) & 0x01; |
| Suzutomo | 7:ffa4066a789d | 35 | DATA_CONTROLLER[CIRCLE] = (data[1] >> 2) & 0x01; |
| Suzutomo | 7:ffa4066a789d | 36 | DATA_CONTROLLER[CROSS] = (data[1] >> 1) & 0x01; |
| Suzutomo | 7:ffa4066a789d | 37 | DATA_CONTROLLER[SQUARE] = (data[1] >> 0) & 0x01; |
| Suzutomo | 7:ffa4066a789d | 38 | DATA_CONTROLLER[L1] = (data[2] >> 7) & 0x01; |
| Suzutomo | 7:ffa4066a789d | 39 | DATA_CONTROLLER[R1] = (data[2] >> 6) & 0x01; |
| Suzutomo | 7:ffa4066a789d | 40 | DATA_CONTROLLER[SHARE] = (data[2] >> 5) & 0x01; |
| Suzutomo | 7:ffa4066a789d | 41 | DATA_CONTROLLER[OPTIONS] = (data[2] >> 4) & 0x01; |
| Suzutomo | 7:ffa4066a789d | 42 | DATA_CONTROLLER[L3] = (data[2] >> 3) & 0x01; |
| Suzutomo | 7:ffa4066a789d | 43 | DATA_CONTROLLER[R3] = (data[2] >> 2) & 0x01; |
| Suzutomo | 7:ffa4066a789d | 44 | DATA_CONTROLLER[PS] = (data[2] >> 1) & 0x01; |
| Suzutomo | 7:ffa4066a789d | 45 | DATA_CONTROLLER[TOUCHPAD] = (data[2] >> 0) & 0x01; |
| Suzutomo | 7:ffa4066a789d | 46 | DATA_CONTROLLER[LeftHatX] = data[3]; |
| Suzutomo | 7:ffa4066a789d | 47 | DATA_CONTROLLER[LeftHatY] = data[4]; |
| Suzutomo | 7:ffa4066a789d | 48 | DATA_CONTROLLER[RightHatX] = data[5]; |
| Suzutomo | 7:ffa4066a789d | 49 | DATA_CONTROLLER[RightHatY] = data[6]; |
| Suzutomo | 7:ffa4066a789d | 50 | DATA_CONTROLLER[L2] = data[7]; |
| Suzutomo | 7:ffa4066a789d | 51 | DATA_CONTROLLER[R2] = data[8]; |
| Suzutomo | 9:b98be6c2f23e | 52 | DATA_TP[X][0] = ((data[9] & 0b11110000) << 4) + data[11]; |
| Suzutomo | 9:b98be6c2f23e | 53 | DATA_TP[X][1] = ((data[9] & 0b00001111)<< 8) + data[12]; |
| Suzutomo | 9:b98be6c2f23e | 54 | DATA_TP[Y][0] = ((data[10] & 0b11000000) << 2) + data[13]; |
| Suzutomo | 9:b98be6c2f23e | 55 | DATA_TP[Y][1] = ((data[10] & 0b00110000) << 4) + data[14]; |
| Suzutomo | 9:b98be6c2f23e | 56 | //DATA_CONTROLLER[PITCH] = ((data[10] & 0b00001100) << 6) + data[15]; |
| Suzutomo | 9:b98be6c2f23e | 57 | //DATA_CONTROLLER[ROLL] = ((data[10] & 0b00000011) << 8) + data[16]; |
| Suzutomo | 8:73810fa167a8 | 58 | |
| yopcyuuu | 3:c1318581351c | 59 | } else { |
| Suzutomo | 7:ffa4066a789d | 60 | for(int i = 0; i < 23; i++) { |
| yopcyuuu | 4:cfef9ff2d209 | 61 | DATA_CONTROLLER[i] = i >= 15 && i <= 18 ? 127 : 0; |
| yopcyuuu | 4:cfef9ff2d209 | 62 | } |
| yopcyuuu | 0:51d821ea634c | 63 | } |
| Suzutomo | 9:b98be6c2f23e | 64 | |
| Suzutomo | 9:b98be6c2f23e | 65 | if (serial->getc() == 0x0A) { |
| Suzutomo | 9:b98be6c2f23e | 66 | for (int i = 0; i<8; i++) { |
| Suzutomo | 9:b98be6c2f23e | 67 | paddata[i] = serial->getc(); |
| Suzutomo | 9:b98be6c2f23e | 68 | } |
| Suzutomo | 9:b98be6c2f23e | 69 | DATA_TP[X][0] = ((paddata[0] & 0b11110000) << 4) + paddata[2]; |
| Suzutomo | 9:b98be6c2f23e | 70 | DATA_TP[X][1] = ((paddata[0] & 0b00001111) << 8) + paddata[3]; |
| Suzutomo | 9:b98be6c2f23e | 71 | DATA_TP[Y][0] = ((paddata[1] & 0b11000000) << 2) + paddata[4]; |
| Suzutomo | 9:b98be6c2f23e | 72 | DATA_TP[Y][1] = ((paddata[1] & 0b00110000) << 4) + paddata[5]; |
| Suzutomo | 9:b98be6c2f23e | 73 | } |
| Suzutomo | 9:b98be6c2f23e | 74 | if (serial->getc() == 0x0B) { |
| Suzutomo | 9:b98be6c2f23e | 75 | int input = serial->getc(); |
| Suzutomo | 9:b98be6c2f23e | 76 | //int b_memory = input % 10; |
| Suzutomo | 9:b98be6c2f23e | 77 | //int a_memory = (input /= 10) % 10; |
| Suzutomo | 9:b98be6c2f23e | 78 | return 1; |
| Suzutomo | 9:b98be6c2f23e | 79 | } |
| Suzutomo | 9:b98be6c2f23e | 80 | return 0; |
| Suzutomo | 9:b98be6c2f23e | 81 | } |
| Suzutomo | 9:b98be6c2f23e | 82 | |
| Suzutomo | 9:b98be6c2f23e | 83 | |
| Suzutomo | 9:b98be6c2f23e | 84 | int PS4::getData ( char a,char b) |
| Suzutomo | 9:b98be6c2f23e | 85 | { |
| Suzutomo | 9:b98be6c2f23e | 86 | serial->putc(0x0B); |
| Suzutomo | 9:b98be6c2f23e | 87 | serial->putc(a); |
| Suzutomo | 9:b98be6c2f23e | 88 | serial->putc(b); |
| Suzutomo | 8:73810fa167a8 | 89 | return 0; |
| yopcyuuu | 0:51d821ea634c | 90 | } |
| yopcyuuu | 0:51d821ea634c | 91 | |
| Suzutomo | 6:0b7476f64352 | 92 | int PS4::getPress( CONTROLLER buttom ) |
| yopcyuuu | 0:51d821ea634c | 93 | { |
| Suzutomo | 9:b98be6c2f23e | 94 | if(buttom < 25) { |
| yopcyuuu | 0:51d821ea634c | 95 | return DATA_CONTROLLER[buttom]; |
| yopcyuuu | 0:51d821ea634c | 96 | } else { |
| yopcyuuu | 0:51d821ea634c | 97 | return 0; |
| yopcyuuu | 0:51d821ea634c | 98 | } |
| yopcyuuu | 0:51d821ea634c | 99 | } |
| yopcyuuu | 0:51d821ea634c | 100 | |
| Suzutomo | 6:0b7476f64352 | 101 | int PS4::getClick( CONTROLLER button, bool mode ) |
| yopcyuuu | 0:51d821ea634c | 102 | { |
| yopcyuuu | 0:51d821ea634c | 103 | //mode:0 -> Rising |
| yopcyuuu | 0:51d821ea634c | 104 | //mode:1 -> Falling |
| yopcyuuu | 3:c1318581351c | 105 | |
| yopcyuuu | 3:c1318581351c | 106 | if(button <= 13) { |
| yopcyuuu | 0:51d821ea634c | 107 | return mode*(DATA_CONTROLLER[button]*!DATA_CONTROLLER_OLD[button]) |
| yopcyuuu | 3:c1318581351c | 108 | + !mode*(!DATA_CONTROLLER[button]*DATA_CONTROLLER_OLD[button]); |
| yopcyuuu | 0:51d821ea634c | 109 | |
| yopcyuuu | 3:c1318581351c | 110 | } else if( (19<=button) && (button<=20) ) { |
| yopcyuuu | 0:51d821ea634c | 111 | return mode*((DATA_CONTROLLER[button]>127)*!(DATA_CONTROLLER_OLD[button]>127)) |
| yopcyuuu | 3:c1318581351c | 112 | + !mode*(!(DATA_CONTROLLER[button]>127)*(DATA_CONTROLLER_OLD[button]>127)); |
| yopcyuuu | 3:c1318581351c | 113 | |
| yopcyuuu | 3:c1318581351c | 114 | } else { |
| yopcyuuu | 0:51d821ea634c | 115 | return 0; |
| yopcyuuu | 0:51d821ea634c | 116 | } |
| yopcyuuu | 0:51d821ea634c | 117 | } |
| Suzutomo | 7:ffa4066a789d | 118 | |
| Suzutomo | 7:ffa4066a789d | 119 | int PS4::touchPad( TP direction, bool finger ) |
| Suzutomo | 7:ffa4066a789d | 120 | { |
| Suzutomo | 7:ffa4066a789d | 121 | return DATA_TP[direction][finger]; |
| Suzutomo | 9:b98be6c2f23e | 122 | } |
| Suzutomo | 9:b98be6c2f23e | 123 | |
| Suzutomo | 9:b98be6c2f23e | 124 | int PS4::getTouchPad() |
| Suzutomo | 9:b98be6c2f23e | 125 | { |
| Suzutomo | 9:b98be6c2f23e | 126 | serial->putc(0x0A); |
| Suzutomo | 9:b98be6c2f23e | 127 | |
| Suzutomo | 9:b98be6c2f23e | 128 | return 0; |
| Suzutomo | 9:b98be6c2f23e | 129 | }*/ |
| Suzutomo | 9:b98be6c2f23e | 130 | |
| Suzutomo | 9:b98be6c2f23e | 131 | int PS4::getPress( int button,bool finger) |
| Suzutomo | 9:b98be6c2f23e | 132 | { |
| Suzutomo | 9:b98be6c2f23e | 133 | if (button >= 1 && button <= 16) return BUTTON_NEW[button - 1]; |
| Suzutomo | 9:b98be6c2f23e | 134 | serial->putc((finger << 7) + button); |
| Suzutomo | 9:b98be6c2f23e | 135 | if (button == 0) { |
| Suzutomo | 9:b98be6c2f23e | 136 | for (int wait = 0; wait < 2000; wait++) if (serial->readable() == 1) return serial->getc(); |
| Suzutomo | 9:b98be6c2f23e | 137 | return 0; // PS4通信成功 -> 1 失敗 -> 0 |
| Suzutomo | 9:b98be6c2f23e | 138 | } |
| Suzutomo | 9:b98be6c2f23e | 139 | if (button == 0xFF) { |
| Suzutomo | 9:b98be6c2f23e | 140 | for (int wait = 0; serial->readable() == 0; wait++) { |
| Suzutomo | 9:b98be6c2f23e | 141 | if (wait > 2000) { |
| Suzutomo | 9:b98be6c2f23e | 142 | for(int i=0; i<16; i++) BUTTON_NEW[i] = BUTTON_OLD[i] = 0; |
| Suzutomo | 9:b98be6c2f23e | 143 | return 0; |
| Suzutomo | 9:b98be6c2f23e | 144 | } |
| Suzutomo | 9:b98be6c2f23e | 145 | } |
| Suzutomo | 9:b98be6c2f23e | 146 | char getData = serial->getc(); |
| Suzutomo | 9:b98be6c2f23e | 147 | for (int i = 0; i<16; i++) BUTTON_OLD[i] = BUTTON_NEW[i]; |
| Suzutomo | 9:b98be6c2f23e | 148 | BUTTON_NEW[UP - 1] = (getData >> 7) & 0x01; |
| Suzutomo | 9:b98be6c2f23e | 149 | BUTTON_NEW[RIGHT - 1] = (getData >> 6) & 0x01; |
| Suzutomo | 9:b98be6c2f23e | 150 | BUTTON_NEW[DOWN - 1] = (getData >> 5) & 0x01; |
| Suzutomo | 9:b98be6c2f23e | 151 | BUTTON_NEW[LEFT - 1] = (getData >> 4) & 0x01; |
| Suzutomo | 9:b98be6c2f23e | 152 | BUTTON_NEW[TRIANGLE - 1] = (getData >> 3) & 0x01; |
| Suzutomo | 9:b98be6c2f23e | 153 | BUTTON_NEW[CIRCLE - 1] = (getData >> 2) & 0x01; |
| Suzutomo | 9:b98be6c2f23e | 154 | BUTTON_NEW[CROSS - 1] = (getData >> 1) & 0x01; |
| Suzutomo | 9:b98be6c2f23e | 155 | BUTTON_NEW[SQUARE - 1] = (getData >> 0) & 0x01; |
| Suzutomo | 9:b98be6c2f23e | 156 | for (int wait = 0; serial->readable() == 0; wait++) { |
| Suzutomo | 9:b98be6c2f23e | 157 | if (wait > 2000) { |
| Suzutomo | 9:b98be6c2f23e | 158 | for(int i=8; i<16; i++) BUTTON_NEW[i] = BUTTON_OLD[i] = 0; |
| Suzutomo | 9:b98be6c2f23e | 159 | return 0; |
| Suzutomo | 9:b98be6c2f23e | 160 | } |
| Suzutomo | 9:b98be6c2f23e | 161 | } |
| Suzutomo | 9:b98be6c2f23e | 162 | getData = serial->getc(); |
| Suzutomo | 9:b98be6c2f23e | 163 | BUTTON_NEW[L1 - 1] = (getData >> 7) & 0x01; |
| Suzutomo | 9:b98be6c2f23e | 164 | BUTTON_NEW[R1 - 1] = (getData >> 6) & 0x01; |
| Suzutomo | 9:b98be6c2f23e | 165 | BUTTON_NEW[SHARE - 1] = (getData >> 5) & 0x01; |
| Suzutomo | 9:b98be6c2f23e | 166 | BUTTON_NEW[OPTIONS - 1] = (getData >> 4) & 0x01; |
| Suzutomo | 9:b98be6c2f23e | 167 | BUTTON_NEW[L3 - 1] = (getData >> 3) & 0x01; |
| Suzutomo | 9:b98be6c2f23e | 168 | BUTTON_NEW[R3 - 1] = (getData >> 2) & 0x01; |
| Suzutomo | 9:b98be6c2f23e | 169 | BUTTON_NEW[PS - 1] = (getData >> 1) & 0x01; |
| Suzutomo | 9:b98be6c2f23e | 170 | BUTTON_NEW[TOUCHPAD - 1] = (getData >> 0) & 0x01; |
| Suzutomo | 9:b98be6c2f23e | 171 | } |
| Suzutomo | 9:b98be6c2f23e | 172 | if (button >= 17 && button <= 22) { |
| Suzutomo | 9:b98be6c2f23e | 173 | for (int wait = 0; serial->readable() == 0; wait++) { |
| Suzutomo | 9:b98be6c2f23e | 174 | if (wait > 2000) { |
| Suzutomo | 9:b98be6c2f23e | 175 | if(button >= 19 && button <= 22) return 127; |
| Suzutomo | 9:b98be6c2f23e | 176 | else return 0; |
| Suzutomo | 9:b98be6c2f23e | 177 | } |
| Suzutomo | 9:b98be6c2f23e | 178 | } |
| Suzutomo | 9:b98be6c2f23e | 179 | char getData = serial->getc(); |
| Suzutomo | 9:b98be6c2f23e | 180 | return getData; |
| Suzutomo | 9:b98be6c2f23e | 181 | } else if (button >= 23 && button <= 26) { |
| Suzutomo | 9:b98be6c2f23e | 182 | for (int wait = 0; serial->readable() == 0; wait++) if (wait > 2000) return 0; |
| Suzutomo | 9:b98be6c2f23e | 183 | char getData = serial->getc(); |
| Suzutomo | 9:b98be6c2f23e | 184 | int getTouchPad = getData << 8; |
| Suzutomo | 9:b98be6c2f23e | 185 | for (int wait = 0; serial->readable() == 0; wait++) if (wait > 2000) return 0; |
| Suzutomo | 9:b98be6c2f23e | 186 | getTouchPad += serial->getc(); |
| Suzutomo | 9:b98be6c2f23e | 187 | return getTouchPad; |
| Suzutomo | 9:b98be6c2f23e | 188 | } |
| Suzutomo | 9:b98be6c2f23e | 189 | return 0; |
| Suzutomo | 9:b98be6c2f23e | 190 | } |
| Suzutomo | 9:b98be6c2f23e | 191 | |
| Suzutomo | 9:b98be6c2f23e | 192 | int PS4::getClick( int button ,bool mode) |
| Suzutomo | 9:b98be6c2f23e | 193 | { |
| Suzutomo | 9:b98be6c2f23e | 194 | if(button >= 1 && button <= 16) return ((BUTTON_NEW[button - 1] & !BUTTON_OLD[button - 1]) & mode) + ((!BUTTON_NEW[button - 1] & BUTTON_OLD[button - 1]) & !mode); |
| Suzutomo | 9:b98be6c2f23e | 195 | return -1; |
| Suzutomo | 9:b98be6c2f23e | 196 | } |
| Suzutomo | 9:b98be6c2f23e | 197 | |
| Suzutomo | 9:b98be6c2f23e | 198 | void PS4::disConnect() { |
| Suzutomo | 9:b98be6c2f23e | 199 | serial->putc(0x20); |
| Suzutomo | 7:ffa4066a789d | 200 | } |
