can_main

Dependencies:   mbed CanMsga

can.cpp

Committer:
kurobikari
Date:
2021-09-01
Revision:
2:2ee241819861
Child:
3:b3cc1eb9fd5c

File content as of revision 2:2ee241819861:

//#include "YKNCT_MD.h"
#include "can.h"
#include "mbed.h"
/*******************************************************************************
 * @名称   YKNCT_MD_I2C
 * @概要   I2Cモジュール"MD"用ライブラリ
*******************************************************************************/


/* 送信データ
[0] [| none | none | none | none | none | none |LAP or SMB| |LAP or SMB|]
[1] PWM値1
[2] PWM値2
*/

YKNCT_MD_CAN::YKNCT_MD_CAN(PinName rd, PinName td,int t) : can(rd, td,t)
{
    /* 初期化 */
    NumCnt = 0;
    /* 送信割り込み */
    interrupt.attach_us(this,&YKNCT_MD_CAN::sent,1800);
    /* 受信割り込み */
    can.attach(this,&YKNCT_MD_CAN::onCanReceived);
}
void YKNCT_MD_CAN::Init(int8_t address, MD_ModeStatus_TypeDef mode)
{
    /* アドレス設定 */
    txMsg[NumCnt/2].id = address+CAN_TX_ADDRESS;
    /* モード設定 */
    txMsg[NumCnt/2].data[0] |= mode<<NumCnt%2;
    /* 出力状態初期化 */
    txMsg[NumCnt/2].data[NumCnt%2+1] = 0;
    /* カウンター増やす */
    Rx_Id[NumCnt] = CAN_RX_ADDRESS+NumCnt;
    NumCnt++;
}
void YKNCT_MD_CAN::Set(int8_t ConNumber, int16_t val)
{
    Set(ConNumber, val, MD_BRAKE);
}

void YKNCT_MD_CAN::Set(int8_t ConNumber, int16_t val, MD_BrakeStatus_TypeDef option)
{
    int PWM = 0;
    PWM = abs(val);
    PWM = Rest(PWM,95);

    /*  送るバイト数設定  */
    txMsg[ConNumber/2].len=3;

    /*  idを設定  */
    txMsg[ConNumber/2].id = ConNumber/2+CAN_TX_ADDRESS;

    /*  マイナスならフラグ立てる  */
    if(val<0)
        txMsg[ConNumber/2].data[ConNumber%2+1] |= (1<<7);

    /*   データセット  PWMを各配列に代入  */
    txMsg[ConNumber/2].data[ConNumber%2+1] |=(char) PWM;
}

int16_t YKNCT_MD_CAN::Get_enc(int8_t ConNumber)
{

    return (int)(double)(data[ConNumber]);
}

void YKNCT_MD_CAN::Exe(void)
{
    static int Scnt=0;
    /*  送信  */
    can.write(txMsg[Scnt]);
    Scnt++;
    Scnt%=NumCnt;
}

void YKNCT_MD_CAN::onCanReceived(void)
{
    static int cnt=0;
    can.read(rxMsg);
    for(int i=0; i<NumCnt; i++) {
        if (rxMsg.id == Rx_Id[i]) {
            /*  エンコーダのデータ受信  一つの基板に付き二つ受信*/
            data[cnt]=(int)((rxMsg.data[2]<<4|rxMsg.data[1]>>4)&0x0fff);
            data[cnt+1]=(int)((rxMsg.data[1]<<8|rxMsg.data[0])&0x0fff);
        }
        cnt+=2;
    }
    cnt=0;
}

void YKNCT_MD_CAN::sent(void)
{
    Exe();
}