FEPとdualshock3

Dependents:   PS3_sample Nucleo_NHK_2018_syudo_wheel kourobo kourobo5 ... more

Committer:
number_key
Date:
Fri Sep 14 04:43:51 2018 +0000
Revision:
3:78827486d24f
Parent:
2:f41f9d145429
ring buffer

Who changed what in which revision?

UserRevisionLine numberNew contents of line
number_key 0:fc5f65cdaaa8 1 #include "PS3.h"
number_key 0:fc5f65cdaaa8 2
number_key 0:fc5f65cdaaa8 3 PS3::PS3(PinName tx, PinName rx) :
number_key 1:7bd8296e6908 4 RawSerial(tx, rx, 115200),
number_key 1:7bd8296e6908 5 timeout(PS3_TIMEOUT_COUNT),
number_key 1:7bd8296e6908 6 status(false)
number_key 0:fc5f65cdaaa8 7 {
number_key 3:78827486d24f 8 bufferPoint = 0;
number_key 3:78827486d24f 9 receivedBytes = 0;
number_key 3:78827486d24f 10 buffer = new uint8_t[PS3_BUFFER_SIZE];
number_key 0:fc5f65cdaaa8 11 attach(callback(this, &PS3::receiveByte));
number_key 3:78827486d24f 12 timeoutTicker.attach(callback(this, &PS3::timeoutLoop), 0.1);
number_key 0:fc5f65cdaaa8 13 }
number_key 0:fc5f65cdaaa8 14
number_key 0:fc5f65cdaaa8 15 void PS3::receiveByte()
number_key 0:fc5f65cdaaa8 16 {
number_key 3:78827486d24f 17 buffer[bufferPoint % PS3_BUFFER_SIZE] = getc();
number_key 1:7bd8296e6908 18 timeout = 0;
number_key 3:78827486d24f 19
number_key 3:78827486d24f 20 if(bufferPoint != 0xff) {
number_key 3:78827486d24f 21 ++bufferPoint;
number_key 3:78827486d24f 22 } else {
number_key 3:78827486d24f 23 bufferPoint = (255%PS3_BUFFER_SIZE)+1;
number_key 3:78827486d24f 24 }
number_key 3:78827486d24f 25
number_key 3:78827486d24f 26 ++receivedBytes;
number_key 3:78827486d24f 27
number_key 3:78827486d24f 28 if(receivedBytes >= PS3_BUFFER_SIZE) checkData();
number_key 0:fc5f65cdaaa8 29 }
number_key 0:fc5f65cdaaa8 30
number_key 0:fc5f65cdaaa8 31 void PS3::assemble()
number_key 0:fc5f65cdaaa8 32 {
number_key 0:fc5f65cdaaa8 33 uint8_t data, i;
number_key 0:fc5f65cdaaa8 34
number_key 0:fc5f65cdaaa8 35 for(i = 0; i < 4; i++) {
number_key 3:78827486d24f 36 stick[i] = buffer[i+9];
number_key 0:fc5f65cdaaa8 37 }
number_key 0:fc5f65cdaaa8 38 for(i = 0; i < 2; i++) {
number_key 3:78827486d24f 39 trigger[i] = buffer[i+13];
number_key 0:fc5f65cdaaa8 40 }
number_key 3:78827486d24f 41 data = buffer[15];
number_key 2:f41f9d145429 42 for(i = 0; i < 6; i++) {
number_key 0:fc5f65cdaaa8 43 button[i] = data & 0x01;
number_key 0:fc5f65cdaaa8 44 data >>= 1;
number_key 0:fc5f65cdaaa8 45 }
number_key 3:78827486d24f 46 data = buffer[16];
number_key 2:f41f9d145429 47 for( ; i < 12; i++) {
number_key 0:fc5f65cdaaa8 48 button[i] = data & 0x01;
number_key 0:fc5f65cdaaa8 49 data >>= 1;
number_key 0:fc5f65cdaaa8 50 }
number_key 0:fc5f65cdaaa8 51 }
number_key 0:fc5f65cdaaa8 52
number_key 3:78827486d24f 53 void PS3::checkData()
number_key 0:fc5f65cdaaa8 54 {
number_key 3:78827486d24f 55 for(int i = 0; i < PS3_BUFFER_SIZE; i++) {
number_key 3:78827486d24f 56 if(buffer[i % PS3_BUFFER_SIZE] == PS3_HEADER0 && buffer[(i + 1) % PS3_BUFFER_SIZE] == PS3_HEADER1 && buffer[(i + 2) % PS3_BUFFER_SIZE] == PS3_HEADER2) {
number_key 3:78827486d24f 57 uint8_t checksum = 0x00;
number_key 3:78827486d24f 58 for(int j = 9; j < PS3_BUFFER_SIZE - 3; j++) {
number_key 3:78827486d24f 59 checksum += buffer[(i + j)% PS3_BUFFER_SIZE];
number_key 3:78827486d24f 60
number_key 3:78827486d24f 61 }
number_key 3:78827486d24f 62 if(checksum == buffer[(i + PS3_BUFFER_SIZE - 3)% PS3_BUFFER_SIZE]) {
number_key 3:78827486d24f 63 assemble();
number_key 3:78827486d24f 64 receivedBytes = 0;
number_key 3:78827486d24f 65
number_key 3:78827486d24f 66 return;
number_key 3:78827486d24f 67 }
number_key 3:78827486d24f 68 }
number_key 3:78827486d24f 69 }
number_key 3:78827486d24f 70 }
number_key 3:78827486d24f 71
number_key 3:78827486d24f 72 void PS3::timeoutLoop()
number_key 3:78827486d24f 73 {
number_key 1:7bd8296e6908 74 if(timeout >= PS3_TIMEOUT_COUNT) {
number_key 1:7bd8296e6908 75 status = false;
number_key 1:7bd8296e6908 76 return;
number_key 1:7bd8296e6908 77 }
number_key 1:7bd8296e6908 78 status = true;
number_key 3:78827486d24f 79 timeout++;
number_key 0:fc5f65cdaaa8 80 }
number_key 0:fc5f65cdaaa8 81
number_key 0:fc5f65cdaaa8 82 bool PS3::getButton(int n)
number_key 0:fc5f65cdaaa8 83 {
number_key 0:fc5f65cdaaa8 84 return button[n];
number_key 0:fc5f65cdaaa8 85 }
number_key 0:fc5f65cdaaa8 86
number_key 0:fc5f65cdaaa8 87 uint8_t PS3::getStick(int n)
number_key 0:fc5f65cdaaa8 88 {
number_key 0:fc5f65cdaaa8 89 return stick[n];
number_key 0:fc5f65cdaaa8 90 }
number_key 0:fc5f65cdaaa8 91
number_key 0:fc5f65cdaaa8 92 uint8_t PS3::getTrigger(int n)
number_key 0:fc5f65cdaaa8 93 {
number_key 0:fc5f65cdaaa8 94 return trigger[n];
number_key 0:fc5f65cdaaa8 95 }