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