SPC music playback tools for real snes apu

Dependencies:   mbed

gpio.cpp

Committer:
akkera102
Date:
2017-01-09
Revision:
0:5bd52e196edb
Child:
2:62e6e22f8be2

File content as of revision 0:5bd52e196edb:

/**
 * @file    gpio.cpp
 * @brief   GPIO クラスの動作の定義を行います
 */

#include "stdafx.h"
#include "gpio.h"
// #include <wiringPi.h>
#include "mbed.h"

DigitalInOut d[] = {
    p5,       // A7
    p6,       // A6
    p7,       // A0
    p8,       // A1
    p9,       // WR
    p10,      // RD

    p11,      // D0
    p12,
    p13,
    p14,
    p15,
    p16,
    p17,
    p18,      // D7

    p19,      // ICL
};


/*! 唯一のインスタンスです */
CGpio CGpio::sm_instance;

/**
 * 初期化
 */
void CGpio::Initialize()
{
//    ::wiringPiSetup();
}

/**
 * I/Oの方向を設定する
 * @param[in] pin ピン番号
 * @param[in] write 方向
 */
void CGpio::PinDir(int pin, bool write)
{
//    ::pinMode(pin, (write ? OUTPUT : INPUT));
    if(write)
    {
        d[pin].output();
    }
    else
    {
        d[pin].input();
    }    
}

/**
 * Output
 * @param[in] pin ピン番号
 * @param[in] high ON/OFF
 */
void CGpio::SetPin(int pin, bool high)
{
//    ::digitalWrite(pin, (high ? HIGH : LOW));
    d[pin] = high ? 1 : 0;
}

/**
 * Input
 * @param[in] pin ピン番号
 * @return ON/OFF
 */
bool CGpio::GetPin(int pin)
{
//    return (::digitalRead(pin) != LOW);
    d[pin].input();
    return d[pin] != 0;
}

/**
 * コンストラクタ
 */
CGpio::CGpio()
    : m_dir(kUninitialize)
{
}

/**
 * バイト書き込み
 * @param[in] c データ
 */
void CGpio::WriteByte(unsigned char c)
{
//    ByteMode(kWrite);
//    ::digitalWriteByte(c);
    int i;

    for(i=6; i<6+8; i++)
    {
        d[i].output();
        d[i] = c & 0x1; 
        c >>= 1;
    }
}

/**
 * バイト読み込み
 * @return データ
 */
unsigned char CGpio::ReadByte()
{
//    ByteMode(kRead);
//    return SwapBits(::digitalReadByte());

    unsigned char ret = 0;
    int i;

    for(i=6; i<6+8; i++)
    {
        d[i].input();
        ret <<= 1;
        ret |= d[i];
    }
    
    return SwapBits(ret); 
}

/**
 * バイト モード
 * @param[in] dir I/O
 */
 /*
void CGpio::ByteMode(ByteDir dir)
{
    if (m_dir != dir)
    {
        m_dir = dir;
        const int mode = (dir != kRead) ? OUTPUT : INPUT;
        for (int i = 0; i < 8; i++)
        {
            ::pinMode(i, mode);
        }
    }
}
*/

/**
 * ビット スワップ
 * @param[in] c データ
 * @return データ
 */
unsigned char CGpio::SwapBits(unsigned char c)
{
    unsigned char s = 0;
    if (c & 0x01)
    {
        s |= 0x80;
    }
    if (c & 0x02)
    {
        s |= 0x40;
    }
    if (c & 0x04)
    {
        s |= 0x20;
    }
    if (c & 0x08)
    {
        s |= 0x10;
    }
    if (c & 0x10)
    {
        s |= 0x08;
    }
    if (c & 0x20)
    {
        s |= 0x04;
    }
    if (c & 0x40)
    {
        s |= 0x02;
    }
    if (c & 0x80)
    {
        s |= 0x01;
    }
    return s;
}