Date: April 2019. Version: 1.0.2. Can Library RX/TX, IDadress and data position. 3 independent timers for sending

Dependents:   CAN_Library_Example Ekran CAN-library

Committer:
renemagrit
Date:
Wed Dec 11 21:46:23 2019 +0000
Revision:
4:b42c40844d4c
Parent:
3:a142cf0e7c37
Last tested version from september 2019.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
renemagrit 0:9cbaaaf1768f 1 #include "CANlibrary.h"
renemagrit 0:9cbaaaf1768f 2
renemagrit 0:9cbaaaf1768f 3
renemagrit 0:9cbaaaf1768f 4 extern CAN can;
renemagrit 3:a142cf0e7c37 5 extern Serial pc;
renemagrit 4:b42c40844d4c 6
renemagrit 1:dade5cf64d0e 7 Ticker tick1; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!! nije hteo da se prevede kao extern
renemagrit 1:dade5cf64d0e 8 Ticker tick2;
renemagrit 1:dade5cf64d0e 9 Ticker tick3;
renemagrit 0:9cbaaaf1768f 10
renemagrit 0:9cbaaaf1768f 11 /******************************************
renemagrit 0:9cbaaaf1768f 12 - - - - - VAZNO! - - - - -
renemagrit 0:9cbaaaf1768f 13 IDjevi se tumace u decimalnom brojnom sistemu
renemagrit 0:9cbaaaf1768f 14 - can_flag niz treba namestiti adrese da idu u u intervalu od 0-15 celobrojno
renemagrit 0:9cbaaaf1768f 15 - tj, mogle bi da se i koriste one od 2000h ali tipa da to se oduzima
renemagrit 0:9cbaaaf1768f 16 nekom celobrojom konstantom koja ce davati oseg adresa od 0 do 15
renemagrit 0:9cbaaaf1768f 17 */
renemagrit 0:9cbaaaf1768f 18
renemagrit 0:9cbaaaf1768f 19
renemagrit 0:9cbaaaf1768f 20 bool can_flag[16];
renemagrit 4:b42c40844d4c 21 CANMessage msgs[16];
renemagrit 1:dade5cf64d0e 22 char data[8],data1[8],data2[8],data3[8];
renemagrit 1:dade5cf64d0e 23 char idTX=0,idTX1=0,idTX2=0,idTX3=0;
renemagrit 1:dade5cf64d0e 24 float msgInterval1=0,msgInterval2=0,msgInterval3=0;
renemagrit 0:9cbaaaf1768f 25
renemagrit 0:9cbaaaf1768f 26 void can_initRX(){
renemagrit 0:9cbaaaf1768f 27 can.attach(can_msg_receive, CAN::RxIrq);
renemagrit 0:9cbaaaf1768f 28 }
renemagrit 4:b42c40844d4c 29 void can_msg_receive(){ // CAN RX Interrupt Function
renemagrit 0:9cbaaaf1768f 30 CANMessage tmpMsg;
renemagrit 0:9cbaaaf1768f 31 if (can.read(tmpMsg)) { //Detect message
renemagrit 0:9cbaaaf1768f 32 can_flag[tmpMsg.id]=true;
renemagrit 4:b42c40844d4c 33 msgs[tmpMsg.id%16]=tmpMsg;
renemagrit 0:9cbaaaf1768f 34 }
renemagrit 0:9cbaaaf1768f 35 };
renemagrit 0:9cbaaaf1768f 36
renemagrit 0:9cbaaaf1768f 37 uint16_t get_data(char id, char indeks){
renemagrit 0:9cbaaaf1768f 38 return msgs[id].data[indeks<<1] | (msgs[id].data[(indeks << 1) + 1] << 8);
renemagrit 0:9cbaaaf1768f 39 }
renemagrit 0:9cbaaaf1768f 40
renemagrit 0:9cbaaaf1768f 41 bool check_flag(char id){
renemagrit 0:9cbaaaf1768f 42 bool ret = can_flag[id];
renemagrit 0:9cbaaaf1768f 43 can_flag[id]=false;
renemagrit 0:9cbaaaf1768f 44 return ret;
renemagrit 0:9cbaaaf1768f 45 }
renemagrit 0:9cbaaaf1768f 46
renemagrit 0:9cbaaaf1768f 47
renemagrit 0:9cbaaaf1768f 48 //-------------------------------------------------------------------
renemagrit 0:9cbaaaf1768f 49 //-------------------------------------------------------------------
renemagrit 0:9cbaaaf1768f 50 // Funkcije slanja poruka:
renemagrit 0:9cbaaaf1768f 51 void canTX_set_Interval(float inter){
renemagrit 0:9cbaaaf1768f 52
renemagrit 0:9cbaaaf1768f 53 //Zadavanje fiksnog intervala slanja CAN poruke
renemagrit 0:9cbaaaf1768f 54 //Vrednost je realna. Jedinica zadavanja je u sekundama.
renemagrit 1:dade5cf64d0e 55 msgInterval1=inter;
renemagrit 1:dade5cf64d0e 56 }
renemagrit 1:dade5cf64d0e 57
renemagrit 1:dade5cf64d0e 58 void canTX_set_Interval_1(float inter){
renemagrit 1:dade5cf64d0e 59
renemagrit 1:dade5cf64d0e 60 //Zadavanje fiksnog intervala slanja CAN poruke
renemagrit 1:dade5cf64d0e 61 //Vrednost je realna. Jedinica zadavanja je u sekundama.
renemagrit 1:dade5cf64d0e 62 msgInterval1=inter;
renemagrit 0:9cbaaaf1768f 63 }
renemagrit 0:9cbaaaf1768f 64
renemagrit 1:dade5cf64d0e 65 void canTX_set_Interval_2(float inter){
renemagrit 1:dade5cf64d0e 66
renemagrit 1:dade5cf64d0e 67 //Zadavanje fiksnog intervala slanja CAN poruke
renemagrit 1:dade5cf64d0e 68 //Vrednost je realna. Jedinica zadavanja je u sekundama.
renemagrit 1:dade5cf64d0e 69 msgInterval2=inter;
renemagrit 1:dade5cf64d0e 70 }
renemagrit 1:dade5cf64d0e 71
renemagrit 1:dade5cf64d0e 72 void canTX_set_Interval_3(float inter){
renemagrit 1:dade5cf64d0e 73
renemagrit 1:dade5cf64d0e 74 //Zadavanje fiksnog intervala slanja CAN poruke
renemagrit 1:dade5cf64d0e 75 //Vrednost je realna. Jedinica zadavanja je u sekundama.
renemagrit 1:dade5cf64d0e 76 msgInterval3=inter;
renemagrit 1:dade5cf64d0e 77 }
renemagrit 0:9cbaaaf1768f 78 void can_initTX(char idtx){
renemagrit 0:9cbaaaf1768f 79
renemagrit 0:9cbaaaf1768f 80 //Fukcija koja zadaje fiksnu adresu slanja poruke
renemagrit 1:dade5cf64d0e 81 idTX1=idtx;
renemagrit 1:dade5cf64d0e 82 }
renemagrit 1:dade5cf64d0e 83
renemagrit 1:dade5cf64d0e 84 void can_initTX1(char idtx){
renemagrit 1:dade5cf64d0e 85
renemagrit 1:dade5cf64d0e 86 //Fukcija koja zadaje fiksnu adresu slanja poruke
renemagrit 1:dade5cf64d0e 87 idTX1=idtx;
renemagrit 1:dade5cf64d0e 88 }
renemagrit 1:dade5cf64d0e 89
renemagrit 1:dade5cf64d0e 90 void can_initTX2(char idtx){
renemagrit 1:dade5cf64d0e 91
renemagrit 1:dade5cf64d0e 92 //Fukcija koja zadaje fiksnu adresu slanja poruke
renemagrit 1:dade5cf64d0e 93 idTX2=idtx;
renemagrit 1:dade5cf64d0e 94 }
renemagrit 1:dade5cf64d0e 95
renemagrit 1:dade5cf64d0e 96 void can_initTX3(char idtx){
renemagrit 1:dade5cf64d0e 97
renemagrit 1:dade5cf64d0e 98 //Fukcija koja zadaje fiksnu adresu slanja poruke
renemagrit 1:dade5cf64d0e 99 idTX3=idtx;
renemagrit 0:9cbaaaf1768f 100 }
renemagrit 0:9cbaaaf1768f 101 void can_msg_send(){
renemagrit 0:9cbaaaf1768f 102
renemagrit 0:9cbaaaf1768f 103 /*
renemagrit 0:9cbaaaf1768f 104 * Fukcija koja salje podatke na CAN mrezu po zadatom,setovanom, IDju.
renemagrit 0:9cbaaaf1768f 105 * Duzina poruke podesena je fiksno na 8B.
renemagrit 0:9cbaaaf1768f 106 */
renemagrit 1:dade5cf64d0e 107 can.write(CANMessage((uint16_t)idTX1, data1, 8));
renemagrit 1:dade5cf64d0e 108 }
renemagrit 1:dade5cf64d0e 109 void can_msg_send1(){
renemagrit 1:dade5cf64d0e 110
renemagrit 1:dade5cf64d0e 111 /*
renemagrit 1:dade5cf64d0e 112 * Fukcija koja salje podatke na CAN mrezu po zadatom,setovanom, IDju.
renemagrit 1:dade5cf64d0e 113 * Duzina poruke podesena je fiksno na 8B.
renemagrit 1:dade5cf64d0e 114 */
renemagrit 1:dade5cf64d0e 115 can.write(CANMessage((uint16_t)idTX1, data1, 8));
renemagrit 0:9cbaaaf1768f 116 }
renemagrit 1:dade5cf64d0e 117 void can_msg_send2(){
renemagrit 1:dade5cf64d0e 118
renemagrit 1:dade5cf64d0e 119 /*
renemagrit 1:dade5cf64d0e 120 * Fukcija koja salje podatke na CAN mrezu po zadatom,setovanom, IDju.
renemagrit 1:dade5cf64d0e 121 * Duzina poruke podesena je fiksno na 8B.
renemagrit 1:dade5cf64d0e 122 */
renemagrit 1:dade5cf64d0e 123 can.write(CANMessage((uint16_t)idTX2, data2, 8));
renemagrit 1:dade5cf64d0e 124 }
renemagrit 1:dade5cf64d0e 125 void can_msg_send3(){
renemagrit 1:dade5cf64d0e 126
renemagrit 1:dade5cf64d0e 127 /*
renemagrit 1:dade5cf64d0e 128 * Fukcija koja salje podatke na CAN mrezu po zadatom,setovanom, IDju.
renemagrit 1:dade5cf64d0e 129 * Duzina poruke podesena je fiksno na 8B.
renemagrit 1:dade5cf64d0e 130 */
renemagrit 1:dade5cf64d0e 131 can.write(CANMessage((uint16_t)idTX3, data3, 8));
renemagrit 1:dade5cf64d0e 132 }
renemagrit 1:dade5cf64d0e 133
renemagrit 0:9cbaaaf1768f 134 void can_msg_send_tick(){
renemagrit 0:9cbaaaf1768f 135
renemagrit 0:9cbaaaf1768f 136 //Funkcija koja se poziva za slanje poruka u okviru fiksnog intervala
renemagrit 1:dade5cf64d0e 137 idTX=idTX1;
renemagrit 1:dade5cf64d0e 138 //strcpy(data,data1);
renemagrit 1:dade5cf64d0e 139 tick1.attach(can_msg_send1, msgInterval1);
renemagrit 1:dade5cf64d0e 140 }
renemagrit 1:dade5cf64d0e 141 void can_msg_send_tick1(){
renemagrit 1:dade5cf64d0e 142
renemagrit 1:dade5cf64d0e 143 //Funkcija koja se poziva za slanje poruka u okviru fiksnog intervala
renemagrit 1:dade5cf64d0e 144 idTX=idTX1;
renemagrit 1:dade5cf64d0e 145 //strcpy(data,data1);
renemagrit 1:dade5cf64d0e 146 tick1.attach(can_msg_send1, msgInterval1);
renemagrit 1:dade5cf64d0e 147 }
renemagrit 1:dade5cf64d0e 148 void can_msg_send_tick2(){
renemagrit 1:dade5cf64d0e 149
renemagrit 1:dade5cf64d0e 150 //Funkcija koja se poziva za slanje poruka u okviru fiksnog intervala
renemagrit 1:dade5cf64d0e 151 idTX=idTX2;
renemagrit 1:dade5cf64d0e 152 //strcpy(data,data2);
renemagrit 1:dade5cf64d0e 153 tick2.attach(can_msg_send2, msgInterval2);
renemagrit 1:dade5cf64d0e 154 }
renemagrit 1:dade5cf64d0e 155 void can_msg_send_tick3(){
renemagrit 1:dade5cf64d0e 156
renemagrit 1:dade5cf64d0e 157 //Funkcija koja se poziva za slanje poruka u okviru fiksnog intervala
renemagrit 1:dade5cf64d0e 158 idTX=idTX3;
renemagrit 1:dade5cf64d0e 159 //strcpy(data,data3);
renemagrit 1:dade5cf64d0e 160 tick3.attach(can_msg_send3, msgInterval3);
renemagrit 0:9cbaaaf1768f 161 }
renemagrit 0:9cbaaaf1768f 162 //----------------------------------------------------------------------------
renemagrit 0:9cbaaaf1768f 163 /* Pomocne funkcije za pakovanje podataka prilikom slanja:
renemagrit 0:9cbaaaf1768f 164 * Ove funkcije omogućavaju da automatsko pakovanje u razlicite velicine poruke
renemagrit 0:9cbaaaf1768f 165 * u zavisnosti od tipa i pozicije na kojoj treba poslati podatak.
renemagrit 0:9cbaaaf1768f 166 *
renemagrit 0:9cbaaaf1768f 167 * Realizovane su za dva tipa:
renemagrit 0:9cbaaaf1768f 168 * -unit16_t (automatsko pakovanje u dva podatka od po 1B)
renemagrit 0:9cbaaaf1768f 169 * -char
renemagrit 0:9cbaaaf1768f 170 *
renemagrit 0:9cbaaaf1768f 171 * Format: dta = vrednost koju saljemo kao podatak CANom, pos = pozicija u CAN
renemagrit 0:9cbaaaf1768f 172 * poruci.
renemagrit 0:9cbaaaf1768f 173 *
renemagrit 0:9cbaaaf1768f 174 * CAN poruka: (IDslanja, DD7, DD6, DD5, DD4, DD3,DD2, DD1, DD0)
renemagrit 0:9cbaaaf1768f 175 * Velicina podataka (DD7...DD0) je od po 1Byte.
renemagrit 0:9cbaaaf1768f 176 * Maximalno se mogu poslati 4 podatka od po 2B (pos polje u opsegu od 0 do 3)
renemagrit 0:9cbaaaf1768f 177 * ili 8 od po 1B (pos polje u opsegu od 0 do 7).
renemagrit 0:9cbaaaf1768f 178 */
renemagrit 0:9cbaaaf1768f 179 void pack_data(uint16_t dta, char pos){
renemagrit 0:9cbaaaf1768f 180
renemagrit 0:9cbaaaf1768f 181 //Pakuje unit16_t u dva podatka od po 1B, na poziciji pos u CAN poruci
renemagrit 1:dade5cf64d0e 182 data1[pos<<1] = dta;
renemagrit 1:dade5cf64d0e 183 data1[(pos<<1)+1] = dta >> 8;
renemagrit 1:dade5cf64d0e 184 }
renemagrit 1:dade5cf64d0e 185
renemagrit 1:dade5cf64d0e 186 void pack_data1(uint16_t dta, char pos){
renemagrit 1:dade5cf64d0e 187
renemagrit 1:dade5cf64d0e 188 //Pakuje unit16_t u dva podatka od po 1B, na poziciji pos u CAN poruci
renemagrit 1:dade5cf64d0e 189 data1[pos<<1] = dta;
renemagrit 1:dade5cf64d0e 190 data1[(pos<<1)+1] = dta >> 8;
renemagrit 1:dade5cf64d0e 191 }
renemagrit 1:dade5cf64d0e 192
renemagrit 1:dade5cf64d0e 193 void pack_data1(char dta, char pos){
renemagrit 1:dade5cf64d0e 194
renemagrit 1:dade5cf64d0e 195 //Pakuje char u jedan podatka od 1B, na poziciji pos u CAN poruci
renemagrit 1:dade5cf64d0e 196 data1[pos<<1] = dta;
renemagrit 0:9cbaaaf1768f 197 }
renemagrit 0:9cbaaaf1768f 198
renemagrit 1:dade5cf64d0e 199 void pack_data2(uint16_t dta, char pos){
renemagrit 1:dade5cf64d0e 200
renemagrit 1:dade5cf64d0e 201 //Pakuje unit16_t u dva podatka od po 1B, na poziciji pos u CAN poruci
renemagrit 1:dade5cf64d0e 202 data2[pos<<1] = dta;
renemagrit 1:dade5cf64d0e 203 data2[(pos<<1)+1] = dta >> 8;
renemagrit 1:dade5cf64d0e 204 }
renemagrit 1:dade5cf64d0e 205
renemagrit 1:dade5cf64d0e 206 void pack_data2(char dta, char pos){
renemagrit 0:9cbaaaf1768f 207
renemagrit 0:9cbaaaf1768f 208 //Pakuje char u jedan podatka od 1B, na poziciji pos u CAN poruci
renemagrit 1:dade5cf64d0e 209 data2[pos<<1] = dta;
renemagrit 1:dade5cf64d0e 210 }
renemagrit 1:dade5cf64d0e 211
renemagrit 1:dade5cf64d0e 212 void pack_data3(uint16_t dta, char pos){
renemagrit 1:dade5cf64d0e 213
renemagrit 1:dade5cf64d0e 214 //Pakuje unit16_t u dva podatka od po 1B, na poziciji pos u CAN poruci
renemagrit 1:dade5cf64d0e 215 data3[pos<<1] = dta;
renemagrit 1:dade5cf64d0e 216 data3[(pos<<1)+1] = dta >> 8;
renemagrit 1:dade5cf64d0e 217 }
renemagrit 1:dade5cf64d0e 218
renemagrit 1:dade5cf64d0e 219 void pack_data3(char dta, char pos){
renemagrit 1:dade5cf64d0e 220
renemagrit 1:dade5cf64d0e 221 //Pakuje char u jedan podatka od 1B, na poziciji pos u CAN poruci
renemagrit 1:dade5cf64d0e 222 data3[pos<<1] = dta;
renemagrit 0:9cbaaaf1768f 223 }
renemagrit 0:9cbaaaf1768f 224
renemagrit 0:9cbaaaf1768f 225