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:
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?

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 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