FEPとdualshock3
Dependents: PS3_sample Nucleo_NHK_2018_syudo_wheel kourobo kourobo5 ... more
PS3.cpp@3:78827486d24f, 2018-09-14 (annotated)
- 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?
User | Revision | Line number | New 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 | } |