ichinoseki_Bteam_2019 / Mycan

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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Mycan.cpp Source File

Mycan.cpp

00001 #include "Mycan.h"
00002 
00003 
00004 /*----------------------------------------------------*/
00005 
00006 //"id"は小さくしたほうがメモリ効率がいいですね
00007 //あと、整数で使うときは"num"は1~7、小数は0か1で御願いします
00008 
00009 /*----------------------------------------------------*/
00010 
00011 Mycan::Mycan(PinName _rd, PinName _td, float freq) : can(_rd, _td)
00012 {
00013     can.frequency(freq);
00014 };
00015 
00016 void Mycan::setI(uint32_t _id, int _num, int16_t _data)
00017 {
00018     write_type = 0;
00019     td_id = _id;
00020     td_num = _num;
00021     td_data.value[td_num] = _data;
00022     
00023     for (int i = 0; i < 7; i++)
00024     {
00025         if (td_data.value[i] >= 0)
00026             td_integer.value[7] &= ~(1 << i);
00027         else
00028             td_integer.value[7] |= (1 << i);
00029         td_integer.value[i] = abs(td_data.value[i]);
00030     }
00031 }
00032 
00033 void Mycan::setF(uint32_t _id, int _num, float _data)
00034 {
00035     write_type = 1;
00036     td_id = _id;
00037     td_num = _num;
00038     td_decimal.value[td_num] = _data;
00039 }
00040 
00041 bool Mycan::send()
00042 {
00043     bool return_val;
00044     if(!write_type) 
00045         return_val = can.write(CANMessage(td_id, (char*)&td_integer, 8));
00046     else if(write_type) 
00047         return_val = can.write(CANMessage(td_id, (char*)&td_decimal, 8));
00048     
00049     return return_val;
00050 }
00051 
00052 void Mycan::readI()
00053 {
00054     read_type = 0;
00055     CANMessage received;
00056     can.read(received);
00057     rd_integer = *(can_integer*)received.data;
00058     
00059     for (int i = 0; i < 7; i++) {
00060         if (rd_integer.value[7] & (1 << i))
00061             integer_storage.value[i] = rd_integer.value[i] * -1;
00062         else integer_storage.value[i] = rd_integer.value[i];
00063     }
00064     integer_values_storage[received.id] = integer_storage;
00065 }
00066 
00067 void Mycan::readF()
00068 {
00069     read_type = 1;
00070     CANMessage received;
00071     can.read(received);
00072     rd_decimal = *(can_decimal *)received.data;
00073     
00074     decimal_values_storage[received.id].value[0] = rd_decimal.value[0];
00075     decimal_values_storage[received.id].value[1] = rd_decimal.value[1];
00076 }
00077 
00078 float Mycan::get(uint32_t _id, int _num)
00079 {
00080     float return_val;
00081     rd_id = _id;
00082     rd_num = _num;
00083     if(!read_type) 
00084         return_val = integer_values_storage[rd_id].value[rd_num];
00085     else if(read_type) 
00086         return_val = decimal_values_storage[rd_id].value[rd_num];
00087     
00088     return return_val;
00089 }