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