teamALI / Mbed 2 deprecated HB2018

Dependencies:   mbed FreeRTOS

uart.cpp

Committer:
MasashiNomura
Date:
2018-11-24
Revision:
7:bfbbf605be43
Parent:
1:15ab74f0d0f1
Child:
8:1ca49cb18290

File content as of revision 7:bfbbf605be43:

#include "typedef.h"
#include "uart.h"
#include "command.h"

#include <vector>
#include <string>
#include <sstream>
using namespace std;

//#define WIREED_SERIAL

//シリアルポートインスタンス
#ifdef  WIREED_SERIAL
    Serial sp(USBTX, USBRX); //有線のポート
    #define BAUD_RATE   9600
#else
    Serial  sp(p9, p10);//TWILITEをモジュールを接続したポート
    #define BAUD_RATE   115200
#endif

Serial sp46Axis(p28,p27);
#define BAUD_RATE4_6AXIS   115200

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// UART 受信割り込みハンドラ
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void uartRxIntHndler(){
    //1Byte抜き出す
    UCHAR buf = sp.getc();
    //エコーバック
    sp.putc(buf);
    //コマンドバッファに突っ込む
    commandPush(buf);
}

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// UART 受信割り込みハンドラ for Arduino UNO(Six Axis Sensor)
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void uartRxIntHndler46Axis(){
    //1Byte抜き出す
    UCHAR buf = sp46Axis.getc();
    //エコーバック
    sp46Axis.putc(buf);
    //スルーするためのバッファに突っ込む
    PushBuf(buf);
}

//=============================================================
//初期設定
//=============================================================
void uartInit(){
    //ボーレート設定
    sp.baud(BAUD_RATE);
    
    //受信割り込みハンドラ登録
    sp.attach
        (uartRxIntHndler    //登録するハンドラ
        ,Serial::RxIrq           //割り込み要因
        );
        
    sp.printf("***********\r\n");
    sp.printf("UART open!!\r\n");    
    sp.printf("-----------\r\n");
    sp.printf("short = %d\r\n" ,sizeof(unsigned short) );
    sp.printf("int   = %d\r\n" ,sizeof(unsigned int) );
    sp.printf("long  = %d\r\n" ,sizeof(unsigned long) );
    sp.printf("***********\r\n");

    ////////////////////////////
    // for 6Axis Sensor
    //ボーレート設定
    sp46Axis.baud(BAUD_RATE4_6AXIS);
    
    //受信割り込みハンドラ登録
    sp46Axis.attach
        (uartRxIntHndler46Axis    //登録するハンドラ
        ,Serial::RxIrq           //割り込み要因
        );
        
    sp46Axis.printf("***********\r\n");
    sp46Axis.printf("UART open!!\r\n");    
    sp46Axis.printf("-----------\r\n");
    sp46Axis.printf("short = %d\r\n" ,sizeof(unsigned short) );
    sp46Axis.printf("int   = %d\r\n" ,sizeof(unsigned int) );
    sp46Axis.printf("long  = %d\r\n" ,sizeof(unsigned long) );
    sp46Axis.printf("***********\r\n");
    
    // bufferのクリア
    InitBuf();
    ////////////////////////////
}

static std::vector<std::string> split(const std::string &str, char sep)
{
    std::vector<std::string> v;
    std::stringstream ss(str);
    std::string buffer;
    while( std::getline(ss, buffer, sep) ) {
        v.push_back(buffer);
    }
    return v;
}

void InitBuf()
{
    idxBufByG = 0;
    memset(bufDataByGyro, 0x00, sizeof(bufDataByGyro));
    accZ = gyroZ = yaw = 0.0f;
}

void PushBuf(UCHAR rxChar)
{
    bufDataByGyro[idxBufByG] = rxChar;
    ++idxBufByG;
    if(0x0A != rxChar){
        return;
    }
    else
    {
        //std::size_t sz;
        std::string str((char*)bufDataByGyro);
        std::vector<std::string> list = split(str,0x09);
        if(list.size() > 0 && list.size() < 4){
            yaw = atof(list.at(0).c_str());
            accZ = atof(list.at(1).c_str());
            gyroZ = atof(list.at(2).c_str());
            sp.printf("yaw = %f " ,yaw );
            sp.printf("acc = %f" ,accZ );
            sp.printf("gyro = %f\r\n" ,gyroZ );
        }
        idxBufByG = 0;
        memset(bufDataByGyro, 0x00, sizeof(bufDataByGyro));
    }
}