Suga Koubou 製 PS_PADライブラリ https://developer.mbed.org/users/okini3939/code/PS_PAD/ を改造したもの。単に__rbitが使えなかったので置き換えただけ。

Dependents:   pscontroller project_beta

Fork of PS_PAD by Suga koubou

Committer:
okini3939
Date:
Thu Dec 12 09:04:45 2013 +0000
Revision:
1:840370e1dcce
Parent:
0:6eeefcf5a37a
Child:
2:14f34d92a797
fix

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:6eeefcf5a37a 1 /*
okini3939 0:6eeefcf5a37a 2 * PlayStation Controller library
okini3939 0:6eeefcf5a37a 3 * Copyright (c) 2013 Hiroshi Suga
okini3939 0:6eeefcf5a37a 4 */
okini3939 0:6eeefcf5a37a 5
okini3939 0:6eeefcf5a37a 6 #include "PS_PAD.h"
okini3939 0:6eeefcf5a37a 7
okini3939 0:6eeefcf5a37a 8 PS_PAD::PS_PAD (PinName mosi, PinName miso, PinName sck, PinName cs) : _spi(mosi, miso, sck), _cs(cs) {
okini3939 0:6eeefcf5a37a 9 _spi.format(8, 3);
okini3939 0:6eeefcf5a37a 10 _spi.frequency(250000);
okini3939 0:6eeefcf5a37a 11 _cs = 1;
okini3939 0:6eeefcf5a37a 12 _vib1 = 0;
okini3939 0:6eeefcf5a37a 13 _vib2 = 0;
okini3939 1:840370e1dcce 14 _connected = false;
okini3939 0:6eeefcf5a37a 15 }
okini3939 0:6eeefcf5a37a 16
okini3939 0:6eeefcf5a37a 17 PS_PAD::PS_PAD (SPI &spi, PinName cs) : _spi(spi), _cs(cs) {
okini3939 0:6eeefcf5a37a 18 _spi.format(8, 3);
okini3939 0:6eeefcf5a37a 19 _spi.frequency(250000);
okini3939 0:6eeefcf5a37a 20 _cs = 1;
okini3939 0:6eeefcf5a37a 21 _vib1 = 0;
okini3939 0:6eeefcf5a37a 22 _vib2 = 0;
okini3939 1:840370e1dcce 23 _connected = false;
okini3939 0:6eeefcf5a37a 24 }
okini3939 0:6eeefcf5a37a 25
okini3939 0:6eeefcf5a37a 26 int PS_PAD::init () {
okini3939 0:6eeefcf5a37a 27 const char enter_config_mode[5] = {0x01, 0x43, 0x00, 0x01, 0x00};
okini3939 0:6eeefcf5a37a 28 const char enable_analog_mode[9] = {0x01, 0x44, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00};
okini3939 0:6eeefcf5a37a 29 const char enable_vibration[9] = {0x01, 0x4d, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff};
okini3939 0:6eeefcf5a37a 30 const char exit_config_mode[9] = {0x01, 0x43, 0x00, 0x00, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A};
okini3939 0:6eeefcf5a37a 31 char buf[10];
okini3939 0:6eeefcf5a37a 32
okini3939 0:6eeefcf5a37a 33 send(enter_config_mode, 5, buf);
okini3939 0:6eeefcf5a37a 34 if (buf[2] == 0xff) {
okini3939 0:6eeefcf5a37a 35 return -1;
okini3939 0:6eeefcf5a37a 36 }
okini3939 0:6eeefcf5a37a 37 wait_ms(16);
okini3939 0:6eeefcf5a37a 38 send(enable_analog_mode, 9, buf);
okini3939 0:6eeefcf5a37a 39 wait_ms(16);
okini3939 0:6eeefcf5a37a 40 send(enable_vibration, 9, buf);
okini3939 0:6eeefcf5a37a 41 wait_ms(16);
okini3939 0:6eeefcf5a37a 42 send(exit_config_mode, 9, buf);
okini3939 0:6eeefcf5a37a 43 wait_ms(16);
okini3939 0:6eeefcf5a37a 44 return 0;
okini3939 0:6eeefcf5a37a 45 }
okini3939 0:6eeefcf5a37a 46
okini3939 0:6eeefcf5a37a 47 int PS_PAD::poll () {
okini3939 0:6eeefcf5a37a 48 const char poll_command[9] = {0x01, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
okini3939 0:6eeefcf5a37a 49 int i;
okini3939 0:6eeefcf5a37a 50 char cmd[10], buf[10];
okini3939 0:6eeefcf5a37a 51
okini3939 0:6eeefcf5a37a 52 memcpy(cmd, poll_command, 9);
okini3939 0:6eeefcf5a37a 53 cmd[3] = _vib1;
okini3939 0:6eeefcf5a37a 54 cmd[4] = _vib2;
okini3939 0:6eeefcf5a37a 55 send(cmd, 9, buf);
okini3939 1:840370e1dcce 56 if (buf[2] != 0x5a) {
okini3939 0:6eeefcf5a37a 57 return -1;
okini3939 0:6eeefcf5a37a 58 }
okini3939 0:6eeefcf5a37a 59
okini3939 0:6eeefcf5a37a 60 for (i = 0; i < 6; i ++) {
okini3939 0:6eeefcf5a37a 61 _pad[i] = buf[3 + i];
okini3939 0:6eeefcf5a37a 62 }
okini3939 1:840370e1dcce 63 _connected = true;
okini3939 0:6eeefcf5a37a 64 return 0;
okini3939 0:6eeefcf5a37a 65 }
okini3939 0:6eeefcf5a37a 66
okini3939 0:6eeefcf5a37a 67 int PS_PAD::read (TYPE t) {
okini3939 1:840370e1dcce 68 if (!_connected) {
okini3939 1:840370e1dcce 69 if (t <= BUTTONS) {
okini3939 1:840370e1dcce 70 return 0;
okini3939 1:840370e1dcce 71 } else {
okini3939 1:840370e1dcce 72 return 0x80;
okini3939 1:840370e1dcce 73 }
okini3939 1:840370e1dcce 74 }
okini3939 1:840370e1dcce 75
okini3939 0:6eeefcf5a37a 76 switch (t) {
okini3939 0:6eeefcf5a37a 77 case PAD_LEFT:
okini3939 0:6eeefcf5a37a 78 return _pad[0] & 0x80 ? 0 : 1;
okini3939 0:6eeefcf5a37a 79 case PAD_BOTTOM:
okini3939 0:6eeefcf5a37a 80 return _pad[0] & 0x40 ? 0 : 1;
okini3939 0:6eeefcf5a37a 81 case PAD_RIGHT:
okini3939 0:6eeefcf5a37a 82 return _pad[0] & 0x20 ? 0 : 1;
okini3939 0:6eeefcf5a37a 83 case PAD_TOP:
okini3939 0:6eeefcf5a37a 84 return _pad[0] & 0x10 ? 0 : 1;
okini3939 0:6eeefcf5a37a 85 case PAD_START:
okini3939 0:6eeefcf5a37a 86 return _pad[0] & 0x08 ? 0 : 1;
okini3939 0:6eeefcf5a37a 87 case ANALOG_LEFT:
okini3939 0:6eeefcf5a37a 88 return _pad[0] & 0x04 ? 0 : 1;
okini3939 0:6eeefcf5a37a 89 case ANALOG_RIGHT:
okini3939 0:6eeefcf5a37a 90 return _pad[0] & 0x02 ? 0 : 1;
okini3939 0:6eeefcf5a37a 91 case PAD_SELECT:
okini3939 0:6eeefcf5a37a 92 return _pad[0] & 0x01 ? 0 : 1;
okini3939 0:6eeefcf5a37a 93 case PAD_SQUARE:
okini3939 0:6eeefcf5a37a 94 return _pad[1] & 0x80 ? 0 : 1;
okini3939 0:6eeefcf5a37a 95 case PAD_X:
okini3939 0:6eeefcf5a37a 96 return _pad[1] & 0x40 ? 0 : 1;
okini3939 0:6eeefcf5a37a 97 case PAD_CIRCLE:
okini3939 0:6eeefcf5a37a 98 return _pad[1] & 0x20 ? 0 : 1;
okini3939 0:6eeefcf5a37a 99 case PAD_TRIANGLE:
okini3939 0:6eeefcf5a37a 100 return _pad[1] & 0x10 ? 0 : 1;
okini3939 0:6eeefcf5a37a 101 case PAD_R1:
okini3939 0:6eeefcf5a37a 102 return _pad[1] & 0x08 ? 0 : 1;
okini3939 0:6eeefcf5a37a 103 case PAD_L1:
okini3939 0:6eeefcf5a37a 104 return _pad[1] & 0x04 ? 0 : 1;
okini3939 0:6eeefcf5a37a 105 case PAD_R2:
okini3939 0:6eeefcf5a37a 106 return _pad[1] & 0x02 ? 0 : 1;
okini3939 0:6eeefcf5a37a 107 case PAD_L2:
okini3939 0:6eeefcf5a37a 108 return _pad[1] & 0x01 ? 0 : 1;
okini3939 1:840370e1dcce 109 case BUTTONS:
okini3939 1:840370e1dcce 110 return ~((_pad[1] << 8) | _pad[0]) & 0xffff;
okini3939 0:6eeefcf5a37a 111 case ANALOG_RX:
okini3939 1:840370e1dcce 112 return _pad[2] - 0x80;
okini3939 0:6eeefcf5a37a 113 case ANALOG_RY:
okini3939 1:840370e1dcce 114 return _pad[3] - 0x80;
okini3939 0:6eeefcf5a37a 115 case ANALOG_LX:
okini3939 1:840370e1dcce 116 return _pad[4] - 0x80;
okini3939 0:6eeefcf5a37a 117 case ANALOG_LY:
okini3939 1:840370e1dcce 118 return _pad[5] - 0x80;
okini3939 0:6eeefcf5a37a 119 }
okini3939 0:6eeefcf5a37a 120 return 0;
okini3939 0:6eeefcf5a37a 121 }
okini3939 0:6eeefcf5a37a 122
okini3939 0:6eeefcf5a37a 123 int PS_PAD::vibration (int v1, int v2) {
okini3939 0:6eeefcf5a37a 124 _vib1 = v1 ? 1 : 0;
okini3939 0:6eeefcf5a37a 125 if (v2 < 0) v2 = 0;
okini3939 0:6eeefcf5a37a 126 if (v2 > 0xff) v2 = 0;
okini3939 0:6eeefcf5a37a 127 _vib2 = v2;
okini3939 0:6eeefcf5a37a 128 poll();
okini3939 0:6eeefcf5a37a 129 return 0;
okini3939 0:6eeefcf5a37a 130 }
okini3939 0:6eeefcf5a37a 131
okini3939 0:6eeefcf5a37a 132 int PS_PAD::send (const char *cmd, int len, char *dat) {
okini3939 0:6eeefcf5a37a 133 int i;
okini3939 0:6eeefcf5a37a 134
okini3939 0:6eeefcf5a37a 135 _cs = 0;
okini3939 0:6eeefcf5a37a 136 wait_us(10);
okini3939 0:6eeefcf5a37a 137 for (i = 0; i < len; i ++) {
okini3939 0:6eeefcf5a37a 138 dat[i] = __rbit(_spi.write(__rbit(cmd[i] << 24)) << 24);
okini3939 0:6eeefcf5a37a 139 wait_us(10);
okini3939 0:6eeefcf5a37a 140 }
okini3939 0:6eeefcf5a37a 141 _cs = 1;
okini3939 0:6eeefcf5a37a 142 return i;
okini3939 0:6eeefcf5a37a 143 }
okini3939 0:6eeefcf5a37a 144