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: IntegrationCAN_03apr_FSRA2019
CANlibrary.cpp
00001 #include "CANlibrary.h" 00002 00003 00004 extern CAN can; 00005 Ticker tick; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!! nije hteo da se prevede kao extern 00006 00007 /****************************************** 00008 - - - - - VAZNO! - - - - - 00009 IDjevi se tumace u decimalnom brojnom sistemu 00010 - can_flag niz treba namestiti adrese da idu u u intervalu od 0-15 celobrojno 00011 - tj, mogle bi da se i koriste one od 2000h ali tipa da to se oduzima 00012 nekom celobrojom konstantom koja ce davati oseg adresa od 0 do 15 00013 */ 00014 00015 00016 bool can_flag[16]; 00017 CANMessage msgs[16]; 00018 char data[8]; 00019 char idTX; 00020 float msgInterval=0; 00021 00022 void can_initRX(){ 00023 can.attach(can_msg_receive, CAN::RxIrq); 00024 } 00025 void can_msg_receive(){ // CAN RX Interrupt Function 00026 CANMessage tmpMsg; 00027 if (can.read(tmpMsg)) { //Detect message 00028 can_flag[tmpMsg.id]=true; 00029 msgs[tmpMsg.id]=tmpMsg; 00030 } 00031 }; 00032 00033 uint16_t get_data(char id, char indeks){ 00034 return msgs[id].data[indeks<<1] | (msgs[id].data[(indeks << 1) + 1] << 8); 00035 } 00036 00037 bool check_flag(char id){ 00038 bool ret = can_flag[id]; 00039 can_flag[id]=false; 00040 return ret; 00041 } 00042 00043 00044 //------------------------------------------------------------------- 00045 //------------------------------------------------------------------- 00046 // Funkcije slanja poruka: 00047 00048 void canTX_set_Interval(float inter){ 00049 00050 //Zadavanje fiksnog intervala slanja CAN poruke 00051 //Vrednost je realna. Jedinica zadavanja je u sekundama. 00052 msgInterval=inter; 00053 } 00054 00055 void can_initTX(char idtx){ 00056 00057 //Fukcija koja zadaje fiksnu adresu slanja poruke 00058 idTX=idtx; 00059 } 00060 void can_msg_send(){ 00061 00062 /* 00063 * Fukcija koja salje podatke na CAN mrezu po zadatom,setovanom, IDju. 00064 * Duzina poruke podesena je fiksno na 8B. 00065 */ 00066 can.write(CANMessage((uint16_t)idTX, data, 8)); 00067 } 00068 void can_msg_send_tick(){ 00069 00070 //Funkcija koja se poziva za slanje poruka u okviru fiksnog intervala 00071 tick.attach(can_msg_send, msgInterval); 00072 } 00073 //---------------------------------------------------------------------------- 00074 /* Pomocne funkcije za pakovanje podataka prilikom slanja: 00075 * Ove funkcije omogućavaju da automatsko pakovanje u razlicite velicine poruke 00076 * u zavisnosti od tipa i pozicije na kojoj treba poslati podatak. 00077 * 00078 * Realizovane su za dva tipa: 00079 * -unit16_t (automatsko pakovanje u dva podatka od po 1B) 00080 * -char 00081 * 00082 * Format: dta = vrednost koju saljemo kao podatak CANom, pos = pozicija u CAN 00083 * poruci. 00084 * 00085 * CAN poruka: (IDslanja, DD7, DD6, DD5, DD4, DD3,DD2, DD1, DD0) 00086 * Velicina podataka (DD7...DD0) je od po 1Byte. 00087 * Maximalno se mogu poslati 4 podatka od po 2B (pos polje u opsegu od 0 do 3) 00088 * ili 8 od po 1B (pos polje u opsegu od 0 do 7). 00089 */ 00090 00091 void pack_data(uint16_t dta, char pos){ 00092 00093 //Pakuje unit16_t u dva podatka od po 1B, na poziciji pos u CAN poruci 00094 data[pos<<1] = dta; 00095 data[(pos<<1)+1] = dta >> 8; 00096 } 00097 00098 void pack_data(char dta, char pos){ 00099 00100 //Pakuje char u jedan podatka od 1B, na poziciji pos u CAN poruci 00101 data[pos<<1] = dta; 00102 } 00103 00104 00105
Generated on Thu Jul 14 2022 14:00:52 by
1.7.2