FEPとdualshock3
Dependents: PS3_sample Nucleo_NHK_2018_syudo_wheel kourobo kourobo5 ... more
PS3.cpp
- Committer:
- number_key
- Date:
- 2018-09-14
- Revision:
- 3:78827486d24f
- Parent:
- 2:f41f9d145429
File content as of revision 3:78827486d24f:
#include "PS3.h" PS3::PS3(PinName tx, PinName rx) : RawSerial(tx, rx, 115200), timeout(PS3_TIMEOUT_COUNT), status(false) { bufferPoint = 0; receivedBytes = 0; buffer = new uint8_t[PS3_BUFFER_SIZE]; attach(callback(this, &PS3::receiveByte)); timeoutTicker.attach(callback(this, &PS3::timeoutLoop), 0.1); } void PS3::receiveByte() { buffer[bufferPoint % PS3_BUFFER_SIZE] = getc(); timeout = 0; if(bufferPoint != 0xff) { ++bufferPoint; } else { bufferPoint = (255%PS3_BUFFER_SIZE)+1; } ++receivedBytes; if(receivedBytes >= PS3_BUFFER_SIZE) checkData(); } void PS3::assemble() { uint8_t data, i; for(i = 0; i < 4; i++) { stick[i] = buffer[i+9]; } for(i = 0; i < 2; i++) { trigger[i] = buffer[i+13]; } data = buffer[15]; for(i = 0; i < 6; i++) { button[i] = data & 0x01; data >>= 1; } data = buffer[16]; for( ; i < 12; i++) { button[i] = data & 0x01; data >>= 1; } } void PS3::checkData() { for(int i = 0; i < PS3_BUFFER_SIZE; i++) { if(buffer[i % PS3_BUFFER_SIZE] == PS3_HEADER0 && buffer[(i + 1) % PS3_BUFFER_SIZE] == PS3_HEADER1 && buffer[(i + 2) % PS3_BUFFER_SIZE] == PS3_HEADER2) { uint8_t checksum = 0x00; for(int j = 9; j < PS3_BUFFER_SIZE - 3; j++) { checksum += buffer[(i + j)% PS3_BUFFER_SIZE]; } if(checksum == buffer[(i + PS3_BUFFER_SIZE - 3)% PS3_BUFFER_SIZE]) { assemble(); receivedBytes = 0; return; } } } } void PS3::timeoutLoop() { if(timeout >= PS3_TIMEOUT_COUNT) { status = false; return; } status = true; timeout++; } bool PS3::getButton(int n) { return button[n]; } uint8_t PS3::getStick(int n) { return stick[n]; } uint8_t PS3::getTrigger(int n) { return trigger[n]; }