Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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; } } */