卒研

Fork of ds3_si by ken fuji

ds3_si.cpp

Committer:
kikoaac
Date:
2018-03-02
Revision:
5:5472bead8509
Parent:
4:5bb182ca2b07

File content as of revision 5:5472bead8509:

#include "mbed.h"
#include "ds3_si.h"

ds3_si::ds3_si(PinName tx, PinName rx, int baudrate):serial(tx, rx)
{
    in[0] = 128;
    in[1] = 0;
    in[2] = 0;
    in[3] = 64;
    in[4] = 64;
    in[5] = 64;
    in[6] = 64;
    in[7] = 0;
    
    serial.baud(baudrate);
    serial.attach(callback(this, &ds3_si::serialin), Serial::RxIrq);
}

void ds3_si::serialin()
{__disable_irq();
    NVIC_ClearPendingIRQ(UART0_IRQn);
    NVIC_ClearPendingIRQ(UART1_IRQn);
    NVIC_ClearPendingIRQ(UART2_IRQn);
    NVIC_ClearPendingIRQ(UART3_IRQn);
    if(serial.readable())
    {
        while(serial.getc() != 128) {}
        for(short i = 1; i < 8; i++)
        {
            *(in + i) = serial.getc();
        }
    }
__enable_irq();
}

bool ds3_si::buttonstate(short order)
{
    return in[(order >> 7) + 1] & order;
}

int ds3_si::analogstate(short order)
{
    return (order % 2) ? in[order] - 64 : 64 - in[order];
}

int ds3_si::getinputdata(short order)
{
    return in[order];
}

double ds3_si::getangle(short order)
{
    int x = analogstate(order * 2 + 1);
    int y = analogstate(order * 2 + 2);
    if(x || y)  return atan2(double(y), double(x));
    else        return NONE_angle;
}