H29Ateam / PS4 Serial

Fork of PS4 by H29Ateam

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?

UserRevisionLine numberNew 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 }