ichinoseki_Bteam_2019 / Mycan

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

Committer:
Kirua
Date:
Sat Aug 31 07:26:26 2019 +0000
Revision:
5:4bdeff035517
Parent:
4:7aa2809ad177
Child:
6:9bf1c678d5a4
perfect fix

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Kirua 0:ce8efac4c651 1 #include "Mycan.h"
Kirua 0:ce8efac4c651 2
Kirua 4:7aa2809ad177 3
Kirua 4:7aa2809ad177 4 /*----------------------------------------------------*/
Kirua 4:7aa2809ad177 5
Kirua 4:7aa2809ad177 6 //"id"は小さくしたほうがメモリ効率がいいですね
Kirua 4:7aa2809ad177 7 //あと、整数で使うときは"num"は1~7、小数は0か1で御願いします
Kirua 4:7aa2809ad177 8
Kirua 4:7aa2809ad177 9 /*----------------------------------------------------*/
Kirua 4:7aa2809ad177 10
Kirua 4:7aa2809ad177 11 Mycan::Mycan(PinName _rd, PinName _td, float freq) : can(_rd, _td)
Kirua 0:ce8efac4c651 12 {
Kirua 4:7aa2809ad177 13 can.frequency(freq);
Kirua 0:ce8efac4c651 14 };
Kirua 0:ce8efac4c651 15
Kirua 4:7aa2809ad177 16 void Mycan::setI(uint32_t _id, int _num, int16_t _data)
Kirua 0:ce8efac4c651 17 {
Kirua 4:7aa2809ad177 18 write_type = 0;
Kirua 0:ce8efac4c651 19 td_id = _id;
Kirua 0:ce8efac4c651 20 td_num = _num;
Kirua 4:7aa2809ad177 21 td_integer.value[td_num] = _data;
Kirua 4:7aa2809ad177 22
Kirua 4:7aa2809ad177 23 td_integer.value[0] = 0;
Kirua 4:7aa2809ad177 24 for (int i = 1; i < 8; i++)
Kirua 4:7aa2809ad177 25 {
Kirua 4:7aa2809ad177 26 if (td_integer.value[i] >= 0)
Kirua 4:7aa2809ad177 27 td_integer.value[0] &= ~(1 << i);
Kirua 4:7aa2809ad177 28 else
Kirua 4:7aa2809ad177 29 td_integer.value[0] |= (1 << i);
Kirua 4:7aa2809ad177 30 td_integer.value[i] = abs(td_integer.value[i]);
Kirua 4:7aa2809ad177 31 }
Kirua 4:7aa2809ad177 32 }
Kirua 4:7aa2809ad177 33
Kirua 4:7aa2809ad177 34 void Mycan::setF(uint32_t _id, int _num, float _data)
Kirua 4:7aa2809ad177 35 {
Kirua 4:7aa2809ad177 36 write_type = 1;
Kirua 4:7aa2809ad177 37 td_id = _id;
Kirua 4:7aa2809ad177 38 td_num = _num;
Kirua 4:7aa2809ad177 39 td_decimal.value[td_num] = _data;
Kirua 0:ce8efac4c651 40 }
Kirua 0:ce8efac4c651 41
TanakaTarou 3:055c2d38132f 42 bool Mycan::send()
Kirua 0:ce8efac4c651 43 {
Kirua 4:7aa2809ad177 44 if (!write_type) return can.write(CANMessage(td_id, (char*)&td_integer, 8));
Kirua 4:7aa2809ad177 45 else if (write_type) return can.write(CANMessage(td_id, (char*)&td_decimal, 8));
Kirua 0:ce8efac4c651 46 }
Kirua 0:ce8efac4c651 47
Kirua 4:7aa2809ad177 48 void Mycan::readI()
Kirua 0:ce8efac4c651 49 {
Kirua 4:7aa2809ad177 50 read_type = 0;
Kirua 0:ce8efac4c651 51 CANMessage received;
Kirua 0:ce8efac4c651 52 can.read(received);
Kirua 4:7aa2809ad177 53 rd_integer = *(can_integer*)received.data;
Kirua 4:7aa2809ad177 54
Kirua 4:7aa2809ad177 55 for (int i = 1; i < 8; i++)
Kirua 4:7aa2809ad177 56 rd_storage.value[i] = rd_integer.value[i];
Kirua 4:7aa2809ad177 57 integer_values_storage[received.id] = rd_storage;
Kirua 4:7aa2809ad177 58 for (int i = 1; i < 8; i++) {
Kirua 4:7aa2809ad177 59 if (integer_values_storage[received.id].value[0] & (1 << i))
Kirua 4:7aa2809ad177 60 integer_values_storage[received.id].value[i] *= -1;
Kirua 4:7aa2809ad177 61 }
Kirua 0:ce8efac4c651 62 }
Kirua 0:ce8efac4c651 63
Kirua 4:7aa2809ad177 64 void Mycan::readF()
Kirua 4:7aa2809ad177 65 {
Kirua 4:7aa2809ad177 66 read_type = 1;
Kirua 4:7aa2809ad177 67 CANMessage received;
Kirua 4:7aa2809ad177 68 can.read(received);
Kirua 4:7aa2809ad177 69 rd_decimal = *(can_decimal *)received.data;
Kirua 4:7aa2809ad177 70
Kirua 4:7aa2809ad177 71 decimal_values_storage[received.id].value[0] = rd_decimal.value[0];
Kirua 4:7aa2809ad177 72 decimal_values_storage[received.id].value[1] = rd_decimal.value[1];
Kirua 4:7aa2809ad177 73 }
Kirua 4:7aa2809ad177 74
Kirua 4:7aa2809ad177 75 float Mycan::get(uint32_t _id, int _num)
Kirua 0:ce8efac4c651 76 {
Kirua 0:ce8efac4c651 77 rd_id = _id;
Kirua 0:ce8efac4c651 78 rd_num = _num;
Kirua 4:7aa2809ad177 79 if (!read_type) return integer_values_storage[rd_id].value[rd_num];
Kirua 4:7aa2809ad177 80 else if (read_type) return decimal_values_storage[rd_id].value[rd_num];
Kirua 0:ce8efac4c651 81 }
Kirua 0:ce8efac4c651 82
Kirua 5:4bdeff035517 83 /*
Kirua 5:4bdeff035517 84 #include "mbed.h"
Kirua 5:4bdeff035517 85 #include "Mycan.h"
Kirua 5:4bdeff035517 86
Kirua 5:4bdeff035517 87 Mycan::Mycan(PinName _pin_rd, PinName _pin_td) : can(_pin_rd, _pin_td)
Kirua 5:4bdeff035517 88 {
Kirua 5:4bdeff035517 89 min_id = 1;//ここで最小IDを設定
Kirua 5:4bdeff035517 90 };
Kirua 5:4bdeff035517 91
Kirua 5:4bdeff035517 92 void Mycan::set(unsigned int _id, int _num, float _data)
Kirua 5:4bdeff035517 93 {
Kirua 5:4bdeff035517 94 td_id = _id;
Kirua 5:4bdeff035517 95 td_num = _num;
Kirua 5:4bdeff035517 96 data = _data;
Kirua 5:4bdeff035517 97 write_val[td_num] = data;
Kirua 5:4bdeff035517 98 _expressAbsoluteValue();//絶対値にする関数
Kirua 5:4bdeff035517 99 }
Kirua 5:4bdeff035517 100
Kirua 5:4bdeff035517 101 bool Mycan::send()
Kirua 5:4bdeff035517 102 {
Kirua 5:4bdeff035517 103 return can.write(CANMessage(td_id, (char*)&td_data, 8));
Kirua 5:4bdeff035517 104 }
Kirua 5:4bdeff035517 105
Kirua 5:4bdeff035517 106 void Mycan::read()
Kirua 5:4bdeff035517 107 {
Kirua 5:4bdeff035517 108 CANMessage received;
Kirua 5:4bdeff035517 109 can.read(received);
Kirua 5:4bdeff035517 110 rd_data = *(read_can *)received.data;
Kirua 5:4bdeff035517 111 _expressSignVal(received.id);//符号を付与する関数
Kirua 5:4bdeff035517 112 }
Kirua 5:4bdeff035517 113
Kirua 5:4bdeff035517 114 float Mycan::get(unsigned int _id, int _num)
Kirua 5:4bdeff035517 115 {
Kirua 5:4bdeff035517 116 rd_id = _id;
Kirua 5:4bdeff035517 117 rd_num = _num;
Kirua 5:4bdeff035517 118 return read_val[rd_id - min_id][rd_num];
Kirua 5:4bdeff035517 119 }
Kirua 5:4bdeff035517 120
Kirua 5:4bdeff035517 121 void Mycan::_expressAbsoluteValue()
Kirua 5:4bdeff035517 122 {
Kirua 5:4bdeff035517 123 for (int i = 0; i < 2; i++) {
Kirua 5:4bdeff035517 124 td_data.writeVal[i] = write_val[i];
Kirua 5:4bdeff035517 125 }
Kirua 5:4bdeff035517 126
Kirua 5:4bdeff035517 127 write_val[0] = 0;
Kirua 5:4bdeff035517 128 for (int i = 1; i < 8; i++)
Kirua 5:4bdeff035517 129 {
Kirua 5:4bdeff035517 130 if (write_val[i] >= 0)
Kirua 5:4bdeff035517 131 write_val[0] &= ~(1 << i);
Kirua 5:4bdeff035517 132 else
Kirua 5:4bdeff035517 133 write_val[0] |= (1 << i);
Kirua 5:4bdeff035517 134 }
Kirua 5:4bdeff035517 135 td_data.writeVal[0] = write_val[0];
Kirua 5:4bdeff035517 136 for (int i = 1; i < 8; i++) {
Kirua 5:4bdeff035517 137 td_data.writeVal[i] = abs(write_val[i]);
Kirua 5:4bdeff035517 138 }
Kirua 5:4bdeff035517 139 }
Kirua 5:4bdeff035517 140
Kirua 5:4bdeff035517 141 void Mycan::_expressSignVal(unsigned int id)
Kirua 5:4bdeff035517 142 {
Kirua 5:4bdeff035517 143 for(int i = 0; i < 2; i++) {
Kirua 5:4bdeff035517 144 read_val[id - min_id][i] = rd_data.readVal[i];
Kirua 5:4bdeff035517 145 }
Kirua 5:4bdeff035517 146 for (int j = 1; j < 8; j++)
Kirua 5:4bdeff035517 147 {
Kirua 5:4bdeff035517 148 if (read_val[id - min_id][0] & (1 << j))
Kirua 5:4bdeff035517 149 read_val[id - min_id][j] *= -1;
Kirua 5:4bdeff035517 150 }
Kirua 5:4bdeff035517 151 }
Kirua 5:4bdeff035517 152 */