ichinoseki_Bteam_2019 / Mycan

Dependents:   2019_SwitchNode_AR ArmNode 2919_LineSensor 2019_MD ... more

Mycan.cpp

Committer:
Kirua
Date:
2019-08-31
Revision:
5:4bdeff035517
Parent:
4:7aa2809ad177
Child:
6:9bf1c678d5a4

File content as of revision 5:4bdeff035517:

#include "Mycan.h"


/*----------------------------------------------------*/

//"id"は小さくしたほうがメモリ効率がいいですね
//あと、整数で使うときは"num"は1~7、小数は0か1で御願いします

/*----------------------------------------------------*/

Mycan::Mycan(PinName _rd, PinName _td, float freq) : can(_rd, _td)
{
    can.frequency(freq);
};

void Mycan::setI(uint32_t _id, int _num, int16_t _data)
{
    write_type = 0;
    td_id = _id;
    td_num = _num;
    td_integer.value[td_num] = _data;
    
    td_integer.value[0] = 0;
    for (int i = 1; i < 8; i++)
    {
        if (td_integer.value[i] >= 0)
            td_integer.value[0] &= ~(1 << i);
        else
            td_integer.value[0] |= (1 << i);
        td_integer.value[i] = abs(td_integer.value[i]);
    }
}

void Mycan::setF(uint32_t _id, int _num, float _data)
{
    write_type = 1;
    td_id = _id;
    td_num = _num;
    td_decimal.value[td_num] = _data;
}

bool Mycan::send()
{
    if (!write_type) return can.write(CANMessage(td_id, (char*)&td_integer, 8));
    else if (write_type) return can.write(CANMessage(td_id, (char*)&td_decimal, 8));
}

void Mycan::readI()
{
    read_type = 0;
    CANMessage received;
    can.read(received);
    rd_integer = *(can_integer*)received.data;
    
    for (int i = 1; i < 8; i++)
        rd_storage.value[i] = rd_integer.value[i];
    integer_values_storage[received.id] = rd_storage;
    for (int i = 1; i < 8; i++) {
        if (integer_values_storage[received.id].value[0] & (1 << i))
            integer_values_storage[received.id].value[i] *= -1;
    }
}

void Mycan::readF()
{
    read_type = 1;
    CANMessage received;
    can.read(received);
    rd_decimal = *(can_decimal *)received.data;
    
    decimal_values_storage[received.id].value[0] = rd_decimal.value[0];
    decimal_values_storage[received.id].value[1] = rd_decimal.value[1];
}

float Mycan::get(uint32_t _id, int _num)
{
    rd_id = _id;
    rd_num = _num;
    if (!read_type) return integer_values_storage[rd_id].value[rd_num];
    else if (read_type) return decimal_values_storage[rd_id].value[rd_num];
}

/*
#include "mbed.h"
#include "Mycan.h"
 
Mycan::Mycan(PinName _pin_rd, PinName _pin_td) : can(_pin_rd, _pin_td)
{
    min_id = 1;//ここで最小IDを設定
};
 
void Mycan::set(unsigned int _id, int _num, float _data)
{
    td_id = _id;
    td_num = _num;
    data = _data;
    write_val[td_num] = data;
    _expressAbsoluteValue();//絶対値にする関数
}
 
bool Mycan::send()
{
    return can.write(CANMessage(td_id, (char*)&td_data, 8));
}
 
void Mycan::read()
{
    CANMessage received;
    can.read(received);
    rd_data = *(read_can *)received.data;
    _expressSignVal(received.id);//符号を付与する関数
}
 
float Mycan::get(unsigned int _id, int _num)
{
    rd_id = _id;
    rd_num = _num;
    return read_val[rd_id - min_id][rd_num];
}

void Mycan::_expressAbsoluteValue()
{
    for (int i = 0; i < 2; i++) {
        td_data.writeVal[i] = write_val[i];
    }
    
    write_val[0] = 0;
    for (int i = 1; i < 8; i++)
    {
        if (write_val[i] >= 0)
            write_val[0] &= ~(1 << i);
        else
            write_val[0] |= (1 << i);
    }
    td_data.writeVal[0] = write_val[0];
    for (int i = 1; i < 8; i++) {
        td_data.writeVal[i] = abs(write_val[i]);
    }
}
 
void Mycan::_expressSignVal(unsigned int id)
{
    for(int i = 0; i < 2; i++) {
        read_val[id - min_id][i] = rd_data.readVal[i];
    }
    for (int j = 1; j < 8; j++)
    {
        if (read_val[id - min_id][0] & (1 << j))
            read_val[id - min_id][j] *= -1;
    }
}           
*/