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
- Committer:
- Suzutomo
- Date:
- 2017-12-11
- Revision:
- 9:b98be6c2f23e
- Parent:
- 8:73810fa167a8
- Child:
- 10:c961d228b63e
File content as of revision 9:b98be6c2f23e:
#include "PS4.h"
PS4::PS4(RawSerial *i)
{
serial = i;
serial->baud(115200);
for(int i=0; i<16; i++) {
BUTTON_OLD[i] = 0;
BUTTON_NEW[i] = 0;
}
}
/*bool PS4::UpDate()
{
//Make backup
memcpy( DATA_CONTROLLER_OLD, DATA_CONTROLLER, sizeof(DATA_CONTROLLER) );
//Get data by I2C
//int s = i2c->read((ADDR | 1), data, 17);
if (serial->getc() == 0x80) {
for (int i = 0; i<9; i++) {
data[i] = serial->getc();
}
}
if(1) {
//UpDate
DATA_CONTROLLER[CONNECTION] = (data[0] >> 0) & 0x01;
DATA_CONTROLLER[UP] = (data[1] >> 7) & 0x01;
DATA_CONTROLLER[RIGHT] = (data[1] >> 6) & 0x01;
DATA_CONTROLLER[DOWN] = (data[1] >> 5) & 0x01;
DATA_CONTROLLER[LEFT] = (data[1] >> 4) & 0x01;
DATA_CONTROLLER[TRIANGLE] = (data[1] >> 3) & 0x01;
DATA_CONTROLLER[CIRCLE] = (data[1] >> 2) & 0x01;
DATA_CONTROLLER[CROSS] = (data[1] >> 1) & 0x01;
DATA_CONTROLLER[SQUARE] = (data[1] >> 0) & 0x01;
DATA_CONTROLLER[L1] = (data[2] >> 7) & 0x01;
DATA_CONTROLLER[R1] = (data[2] >> 6) & 0x01;
DATA_CONTROLLER[SHARE] = (data[2] >> 5) & 0x01;
DATA_CONTROLLER[OPTIONS] = (data[2] >> 4) & 0x01;
DATA_CONTROLLER[L3] = (data[2] >> 3) & 0x01;
DATA_CONTROLLER[R3] = (data[2] >> 2) & 0x01;
DATA_CONTROLLER[PS] = (data[2] >> 1) & 0x01;
DATA_CONTROLLER[TOUCHPAD] = (data[2] >> 0) & 0x01;
DATA_CONTROLLER[LeftHatX] = data[3];
DATA_CONTROLLER[LeftHatY] = data[4];
DATA_CONTROLLER[RightHatX] = data[5];
DATA_CONTROLLER[RightHatY] = data[6];
DATA_CONTROLLER[L2] = data[7];
DATA_CONTROLLER[R2] = data[8];
DATA_TP[X][0] = ((data[9] & 0b11110000) << 4) + data[11];
DATA_TP[X][1] = ((data[9] & 0b00001111)<< 8) + data[12];
DATA_TP[Y][0] = ((data[10] & 0b11000000) << 2) + data[13];
DATA_TP[Y][1] = ((data[10] & 0b00110000) << 4) + data[14];
//DATA_CONTROLLER[PITCH] = ((data[10] & 0b00001100) << 6) + data[15];
//DATA_CONTROLLER[ROLL] = ((data[10] & 0b00000011) << 8) + data[16];
} else {
for(int i = 0; i < 23; i++) {
DATA_CONTROLLER[i] = i >= 15 && i <= 18 ? 127 : 0;
}
}
if (serial->getc() == 0x0A) {
for (int i = 0; i<8; i++) {
paddata[i] = serial->getc();
}
DATA_TP[X][0] = ((paddata[0] & 0b11110000) << 4) + paddata[2];
DATA_TP[X][1] = ((paddata[0] & 0b00001111) << 8) + paddata[3];
DATA_TP[Y][0] = ((paddata[1] & 0b11000000) << 2) + paddata[4];
DATA_TP[Y][1] = ((paddata[1] & 0b00110000) << 4) + paddata[5];
}
if (serial->getc() == 0x0B) {
int input = serial->getc();
//int b_memory = input % 10;
//int a_memory = (input /= 10) % 10;
return 1;
}
return 0;
}
int PS4::getData ( char a,char b)
{
serial->putc(0x0B);
serial->putc(a);
serial->putc(b);
return 0;
}
int PS4::getPress( CONTROLLER buttom )
{
if(buttom < 25) {
return DATA_CONTROLLER[buttom];
} else {
return 0;
}
}
int PS4::getClick( CONTROLLER button, bool mode )
{
//mode:0 -> Rising
//mode:1 -> Falling
if(button <= 13) {
return mode*(DATA_CONTROLLER[button]*!DATA_CONTROLLER_OLD[button])
+ !mode*(!DATA_CONTROLLER[button]*DATA_CONTROLLER_OLD[button]);
} else if( (19<=button) && (button<=20) ) {
return mode*((DATA_CONTROLLER[button]>127)*!(DATA_CONTROLLER_OLD[button]>127))
+ !mode*(!(DATA_CONTROLLER[button]>127)*(DATA_CONTROLLER_OLD[button]>127));
} else {
return 0;
}
}
int PS4::touchPad( TP direction, bool finger )
{
return DATA_TP[direction][finger];
}
int PS4::getTouchPad()
{
serial->putc(0x0A);
return 0;
}*/
int PS4::getPress( int button,bool finger)
{
if (button >= 1 && button <= 16) return BUTTON_NEW[button - 1];
serial->putc((finger << 7) + button);
if (button == 0) {
for (int wait = 0; wait < 2000; wait++) if (serial->readable() == 1) return serial->getc();
return 0; // PS4通信成功 -> 1 失敗 -> 0
}
if (button == 0xFF) {
for (int wait = 0; serial->readable() == 0; wait++) {
if (wait > 2000) {
for(int i=0; i<16; i++) BUTTON_NEW[i] = BUTTON_OLD[i] = 0;
return 0;
}
}
char getData = serial->getc();
for (int i = 0; i<16; i++) BUTTON_OLD[i] = BUTTON_NEW[i];
BUTTON_NEW[UP - 1] = (getData >> 7) & 0x01;
BUTTON_NEW[RIGHT - 1] = (getData >> 6) & 0x01;
BUTTON_NEW[DOWN - 1] = (getData >> 5) & 0x01;
BUTTON_NEW[LEFT - 1] = (getData >> 4) & 0x01;
BUTTON_NEW[TRIANGLE - 1] = (getData >> 3) & 0x01;
BUTTON_NEW[CIRCLE - 1] = (getData >> 2) & 0x01;
BUTTON_NEW[CROSS - 1] = (getData >> 1) & 0x01;
BUTTON_NEW[SQUARE - 1] = (getData >> 0) & 0x01;
for (int wait = 0; serial->readable() == 0; wait++) {
if (wait > 2000) {
for(int i=8; i<16; i++) BUTTON_NEW[i] = BUTTON_OLD[i] = 0;
return 0;
}
}
getData = serial->getc();
BUTTON_NEW[L1 - 1] = (getData >> 7) & 0x01;
BUTTON_NEW[R1 - 1] = (getData >> 6) & 0x01;
BUTTON_NEW[SHARE - 1] = (getData >> 5) & 0x01;
BUTTON_NEW[OPTIONS - 1] = (getData >> 4) & 0x01;
BUTTON_NEW[L3 - 1] = (getData >> 3) & 0x01;
BUTTON_NEW[R3 - 1] = (getData >> 2) & 0x01;
BUTTON_NEW[PS - 1] = (getData >> 1) & 0x01;
BUTTON_NEW[TOUCHPAD - 1] = (getData >> 0) & 0x01;
}
if (button >= 17 && button <= 22) {
for (int wait = 0; serial->readable() == 0; wait++) {
if (wait > 2000) {
if(button >= 19 && button <= 22) return 127;
else return 0;
}
}
char getData = serial->getc();
return getData;
} else if (button >= 23 && button <= 26) {
for (int wait = 0; serial->readable() == 0; wait++) if (wait > 2000) return 0;
char getData = serial->getc();
int getTouchPad = getData << 8;
for (int wait = 0; serial->readable() == 0; wait++) if (wait > 2000) return 0;
getTouchPad += serial->getc();
return getTouchPad;
}
return 0;
}
int PS4::getClick( int button ,bool mode)
{
if(button >= 1 && button <= 16) return ((BUTTON_NEW[button - 1] & !BUTTON_OLD[button - 1]) & mode) + ((!BUTTON_NEW[button - 1] & BUTTON_OLD[button - 1]) & !mode);
return -1;
}
void PS4::disConnect() {
serial->putc(0x20);
}
