プレステ1アナログコントローラ用ライブラリのサンプル
pspad.cpp@1:38674ebae5dc, 2013-09-09 (annotated)
- Committer:
- kurt
- Date:
- Mon Sep 09 06:33:08 2013 +0000
- Revision:
- 1:38674ebae5dc
- Parent:
- 0:ab4722670dd8
- Child:
- 3:3a33f8294a84
for publish as lib
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kurt | 0:ab4722670dd8 | 1 | /* |
kurt | 0:ab4722670dd8 | 2 | * pspad.c |
kurt | 0:ab4722670dd8 | 3 | * |
kurt | 0:ab4722670dd8 | 4 | * Created on: 2012/12/21 |
kurt | 0:ab4722670dd8 | 5 | * Author: KORA |
kurt | 0:ab4722670dd8 | 6 | */ |
kurt | 0:ab4722670dd8 | 7 | |
kurt | 0:ab4722670dd8 | 8 | #include "mbed.h" |
kurt | 0:ab4722670dd8 | 9 | #include "pspad.h" |
kurt | 0:ab4722670dd8 | 10 | |
kurt | 0:ab4722670dd8 | 11 | //---------------------------------------------------------- |
kurt | 0:ab4722670dd8 | 12 | // PS PAD |
kurt | 0:ab4722670dd8 | 13 | //---------------------------------------------------------- |
kurt | 0:ab4722670dd8 | 14 | #define PS_DAT datpin //400Ωほどのプルアップ必要 |
kurt | 0:ab4722670dd8 | 15 | #define PS_CMD_H cmdpin = 1 |
kurt | 0:ab4722670dd8 | 16 | #define PS_CMD_L cmdpin = 0 |
kurt | 0:ab4722670dd8 | 17 | #define PS_SEL_H selpin = 1 |
kurt | 0:ab4722670dd8 | 18 | #define PS_SEL_L selpin = 0 |
kurt | 0:ab4722670dd8 | 19 | #define PS_CLK_H clkpin = 1 |
kurt | 0:ab4722670dd8 | 20 | #define PS_CLK_L clkpin = 0 |
kurt | 0:ab4722670dd8 | 21 | |
kurt | 0:ab4722670dd8 | 22 | //---------------------------------------------------------- |
kurt | 0:ab4722670dd8 | 23 | // 動作周波数 |
kurt | 0:ab4722670dd8 | 24 | //---------------------------------------------------------- |
kurt | 0:ab4722670dd8 | 25 | #define PS_FREQ 250//125 // パッドの動作周波数 (kHz) |
kurt | 0:ab4722670dd8 | 26 | // タイマはこの2倍の周波数で動かす |
kurt | 0:ab4722670dd8 | 27 | // 本来250kHzだが変更しても問題ない |
kurt | 0:ab4722670dd8 | 28 | |
kurt | 0:ab4722670dd8 | 29 | #define TM_PERI (500/PS_FREQ) // タイマの1クロックに要する時間(us) |
kurt | 0:ab4722670dd8 | 30 | // タイマの2クロックをパッドの1クロックとしている |
kurt | 0:ab4722670dd8 | 31 | |
kurt | 0:ab4722670dd8 | 32 | //---------------------------------------------------------- |
kurt | 0:ab4722670dd8 | 33 | // constructor |
kurt | 0:ab4722670dd8 | 34 | //---------------------------------------------------------- |
kurt | 0:ab4722670dd8 | 35 | Pspad::Pspad(PinName dat, PinName cmd, PinName sel, PinName clk) : datpin(dat), cmdpin(cmd), selpin(sel), clkpin(clk) |
kurt | 0:ab4722670dd8 | 36 | { |
kurt | 0:ab4722670dd8 | 37 | // GPIOの出力値を設定する |
kurt | 0:ab4722670dd8 | 38 | PS_CMD_H; // CMD を1に |
kurt | 0:ab4722670dd8 | 39 | PS_CLK_H; // CLK を1に |
kurt | 0:ab4722670dd8 | 40 | PS_SEL_H; // SEL を1に |
kurt | 0:ab4722670dd8 | 41 | |
kurt | 0:ab4722670dd8 | 42 | // タイマの設定 |
kurt | 0:ab4722670dd8 | 43 | tm.reset(); |
kurt | 0:ab4722670dd8 | 44 | } |
kurt | 0:ab4722670dd8 | 45 | |
kurt | 0:ab4722670dd8 | 46 | //---------------------------------------------------------- |
kurt | 0:ab4722670dd8 | 47 | // プレステ用ゲームパッドとの1バイトの通信 |
kurt | 0:ab4722670dd8 | 48 | // 引数 |
kurt | 0:ab4722670dd8 | 49 | // int send : 送信データ(0~255) |
kurt | 0:ab4722670dd8 | 50 | // 戻り値 |
kurt | 0:ab4722670dd8 | 51 | // int 受信データ(0~255) |
kurt | 0:ab4722670dd8 | 52 | //---------------------------------------------------------- |
kurt | 0:ab4722670dd8 | 53 | uint8_t Pspad::PsComm( uint8_t send_data ) |
kurt | 0:ab4722670dd8 | 54 | { |
kurt | 0:ab4722670dd8 | 55 | uint8_t i; |
kurt | 0:ab4722670dd8 | 56 | uint8_t recv_data = 0; |
kurt | 0:ab4722670dd8 | 57 | |
kurt | 0:ab4722670dd8 | 58 | // カウント開始 |
kurt | 0:ab4722670dd8 | 59 | tm.start(); |
kurt | 0:ab4722670dd8 | 60 | |
kurt | 0:ab4722670dd8 | 61 | for(i=0; i<8; i++) |
kurt | 0:ab4722670dd8 | 62 | { |
kurt | 0:ab4722670dd8 | 63 | |
kurt | 0:ab4722670dd8 | 64 | // 送信データ |
kurt | 0:ab4722670dd8 | 65 | if(send_data & 0x01){ |
kurt | 0:ab4722670dd8 | 66 | PS_CMD_H; |
kurt | 0:ab4722670dd8 | 67 | }else{ |
kurt | 0:ab4722670dd8 | 68 | PS_CMD_L; |
kurt | 0:ab4722670dd8 | 69 | } |
kurt | 0:ab4722670dd8 | 70 | // クロックをLOWに |
kurt | 0:ab4722670dd8 | 71 | PS_CLK_L; |
kurt | 0:ab4722670dd8 | 72 | // 待機 |
kurt | 0:ab4722670dd8 | 73 | while(tm.read_us()/TM_PERI <= 2*i); |
kurt | 0:ab4722670dd8 | 74 | |
kurt | 0:ab4722670dd8 | 75 | // クロックをHIGHに |
kurt | 0:ab4722670dd8 | 76 | PS_CLK_H; |
kurt | 0:ab4722670dd8 | 77 | // 受信データ |
kurt | 0:ab4722670dd8 | 78 | recv_data |= (PS_DAT<<i); |
kurt | 0:ab4722670dd8 | 79 | // 待機 |
kurt | 0:ab4722670dd8 | 80 | while(tm.read_us()/TM_PERI <= 2*i+1); |
kurt | 0:ab4722670dd8 | 81 | |
kurt | 0:ab4722670dd8 | 82 | // 送信データを1ビットずらす |
kurt | 0:ab4722670dd8 | 83 | send_data >>= 1; |
kurt | 0:ab4722670dd8 | 84 | } |
kurt | 0:ab4722670dd8 | 85 | |
kurt | 0:ab4722670dd8 | 86 | // CMDをHIGHに戻す |
kurt | 0:ab4722670dd8 | 87 | PS_CMD_H; |
kurt | 0:ab4722670dd8 | 88 | |
kurt | 0:ab4722670dd8 | 89 | // 5クロックほど待機 |
kurt | 0:ab4722670dd8 | 90 | while(tm.read_us()/TM_PERI <= 2*8+2*5); |
kurt | 0:ab4722670dd8 | 91 | |
kurt | 0:ab4722670dd8 | 92 | // カウント停止 及び リセット |
kurt | 0:ab4722670dd8 | 93 | tm.stop(); |
kurt | 0:ab4722670dd8 | 94 | tm.reset(); |
kurt | 0:ab4722670dd8 | 95 | |
kurt | 0:ab4722670dd8 | 96 | return recv_data; |
kurt | 0:ab4722670dd8 | 97 | } |
kurt | 0:ab4722670dd8 | 98 | |
kurt | 0:ab4722670dd8 | 99 | //---------------------------------------------------------- |
kurt | 0:ab4722670dd8 | 100 | // プレステ用ゲームパッドからのデータの取得 |
kurt | 0:ab4722670dd8 | 101 | // 変数 |
kurt | 0:ab4722670dd8 | 102 | // uint32_t key ボタンの押下状態をbitmapで返す。 |
kurt | 0:ab4722670dd8 | 103 | // int8_t right_x -128~127 の値を返す。アナログスティック中立時は0 |
kurt | 0:ab4722670dd8 | 104 | // int8_t right_y -128~127 の値を返す。アナログスティック中立時は0 |
kurt | 0:ab4722670dd8 | 105 | // int8_t left_x -128~127 の値を返す。アナログスティック中立時は0 |
kurt | 0:ab4722670dd8 | 106 | // int8_t left_y -128~127 の値を返す。アナログスティック中立時は0 |
kurt | 0:ab4722670dd8 | 107 | //---------------------------------------------------------- |
kurt | 0:ab4722670dd8 | 108 | void Pspad::PsRead(void) |
kurt | 0:ab4722670dd8 | 109 | { |
kurt | 0:ab4722670dd8 | 110 | uint8_t i, len; |
kurt | 0:ab4722670dd8 | 111 | uint8_t rcv[20]; |
kurt | 0:ab4722670dd8 | 112 | |
kurt | 0:ab4722670dd8 | 113 | //BUTTON.WORD = 0; |
kurt | 0:ab4722670dd8 | 114 | right_x = 0; // アナログスティック中立 |
kurt | 0:ab4722670dd8 | 115 | right_y = 0; // アナログスティック中立 |
kurt | 0:ab4722670dd8 | 116 | left_x = 0; // アナログスティック中立 |
kurt | 0:ab4722670dd8 | 117 | left_y = 0; // アナログスティック中立 |
kurt | 0:ab4722670dd8 | 118 | |
kurt | 0:ab4722670dd8 | 119 | // SELをLOWに |
kurt | 0:ab4722670dd8 | 120 | PS_SEL_L; |
kurt | 0:ab4722670dd8 | 121 | |
kurt | 0:ab4722670dd8 | 122 | // 少し待機 |
kurt | 0:ab4722670dd8 | 123 | tm.start(); |
kurt | 0:ab4722670dd8 | 124 | while(tm.read_us() <= 40); // 40usでも動く模様 |
kurt | 0:ab4722670dd8 | 125 | tm.stop(); |
kurt | 0:ab4722670dd8 | 126 | tm.reset(); |
kurt | 0:ab4722670dd8 | 127 | |
kurt | 0:ab4722670dd8 | 128 | // 通信開始 |
kurt | 0:ab4722670dd8 | 129 | rcv[0] = PsComm(0x01); // PADはコマンド'01h'を検出して動作を開始する |
kurt | 0:ab4722670dd8 | 130 | rcv[1] = PsComm(0x42); // 受信データの下位4ビットが転送バイト数の半分の数を表す |
kurt | 0:ab4722670dd8 | 131 | len = (rcv[1] & 0x03) * 2; // 転送バイト数を求める |
kurt | 0:ab4722670dd8 | 132 | unsigned char data = 0x00; |
kurt | 0:ab4722670dd8 | 133 | if(VIBRATE)data = 0x41; |
kurt | 0:ab4722670dd8 | 134 | for(i=0;i<len+1;i++){ |
kurt | 0:ab4722670dd8 | 135 | rcv[i+2] = PsComm(data);//PsComm(0x00); // PADの状態を受信 |
kurt | 0:ab4722670dd8 | 136 | } |
kurt | 0:ab4722670dd8 | 137 | |
kurt | 0:ab4722670dd8 | 138 | // SELをHIGHに |
kurt | 0:ab4722670dd8 | 139 | PS_SEL_H; |
kurt | 0:ab4722670dd8 | 140 | |
kurt | 0:ab4722670dd8 | 141 | // PADの状態を返す |
kurt | 0:ab4722670dd8 | 142 | PREV.BUTTON.WORD = BUTTON.WORD; |
kurt | 0:ab4722670dd8 | 143 | BUTTON.WORD = ((rcv[3]<<8) | rcv[4]) ^ 0xFFFF; |
kurt | 0:ab4722670dd8 | 144 | |
kurt | 0:ab4722670dd8 | 145 | PREV.right_x = right_x; |
kurt | 0:ab4722670dd8 | 146 | PREV.right_y = right_y; |
kurt | 0:ab4722670dd8 | 147 | PREV.left_x = left_x; |
kurt | 0:ab4722670dd8 | 148 | PREV.left_y = left_y; |
kurt | 0:ab4722670dd8 | 149 | if(len >= 6){ //Convert range to -128~127 |
kurt | 0:ab4722670dd8 | 150 | ANALOG_MODE = 1; |
kurt | 0:ab4722670dd8 | 151 | right_x = rcv[5] - 128; |
kurt | 0:ab4722670dd8 | 152 | right_y = -(rcv[6] - 128 +1); |
kurt | 0:ab4722670dd8 | 153 | left_x = rcv[7] - 128; |
kurt | 0:ab4722670dd8 | 154 | left_y = -(rcv[8] - 128 +1); |
kurt | 0:ab4722670dd8 | 155 | }else{ |
kurt | 0:ab4722670dd8 | 156 | ANALOG_MODE = 0; |
kurt | 0:ab4722670dd8 | 157 | right_x = 0; |
kurt | 0:ab4722670dd8 | 158 | right_y = 0; |
kurt | 0:ab4722670dd8 | 159 | left_x = 0; |
kurt | 0:ab4722670dd8 | 160 | left_y = 0; |
kurt | 0:ab4722670dd8 | 161 | } |
kurt | 0:ab4722670dd8 | 162 | } |