プレステ1アナログコントローラ用ライブラリのサンプル

Dependencies:   mbed-src

Committer:
kurt
Date:
Mon Sep 09 06:30:27 2013 +0000
Revision:
0:ab4722670dd8
Child:
3:3a33f8294a84
for publish

Who changed what in which revision?

UserRevisionLine numberNew 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 }