Marta Avramovic / CANlibrary

Dependents:   CAN_Library_Example Ekran CAN-library

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers CANlibrary.cpp Source File

CANlibrary.cpp

00001 #include "CANlibrary.h"
00002 
00003 
00004 extern CAN can;
00005 extern Serial pc;
00006 
00007 Ticker tick1; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!! nije hteo da se prevede kao extern
00008 Ticker tick2;
00009 Ticker tick3;
00010 
00011 /******************************************
00012  - - - - - VAZNO! - - - - -
00013  IDjevi se tumace u decimalnom brojnom sistemu
00014   - can_flag niz treba namestiti adrese da idu u u intervalu od 0-15 celobrojno
00015   - tj, mogle bi da se i koriste one od 2000h ali tipa da to se oduzima 
00016     nekom celobrojom konstantom koja ce davati oseg adresa od 0 do 15
00017 */
00018 
00019 
00020 bool can_flag[16];
00021 CANMessage msgs[16];
00022 char data[8],data1[8],data2[8],data3[8];
00023 char idTX=0,idTX1=0,idTX2=0,idTX3=0;
00024 float msgInterval1=0,msgInterval2=0,msgInterval3=0;
00025 
00026 void can_initRX(){
00027     can.attach(can_msg_receive, CAN::RxIrq); 
00028 }
00029 void can_msg_receive(){                     // CAN RX Interrupt Function
00030     CANMessage tmpMsg;
00031     if (can.read(tmpMsg)) {                 //Detect message
00032         can_flag[tmpMsg.id]=true;
00033         msgs[tmpMsg.id%16]=tmpMsg;
00034     }
00035 };
00036 
00037 uint16_t get_data(char id, char indeks){
00038    return msgs[id].data[indeks<<1] | (msgs[id].data[(indeks << 1) + 1] << 8);
00039 }
00040 
00041 bool check_flag(char id){
00042     bool ret = can_flag[id];
00043     can_flag[id]=false;
00044     return ret;
00045 }
00046 
00047 
00048 //-------------------------------------------------------------------
00049 //-------------------------------------------------------------------
00050 // Funkcije slanja poruka:
00051 void canTX_set_Interval(float inter){ 
00052     
00053     //Zadavanje fiksnog intervala slanja CAN poruke
00054     //Vrednost je realna. Jedinica zadavanja je u sekundama.
00055     msgInterval1=inter;
00056 }
00057 
00058 void canTX_set_Interval_1(float inter){ 
00059     
00060     //Zadavanje fiksnog intervala slanja CAN poruke
00061     //Vrednost je realna. Jedinica zadavanja je u sekundama.
00062     msgInterval1=inter;
00063 }
00064 
00065 void canTX_set_Interval_2(float inter){ 
00066     
00067     //Zadavanje fiksnog intervala slanja CAN poruke
00068     //Vrednost je realna. Jedinica zadavanja je u sekundama.
00069     msgInterval2=inter;
00070 }
00071 
00072 void canTX_set_Interval_3(float inter){ 
00073     
00074     //Zadavanje fiksnog intervala slanja CAN poruke
00075     //Vrednost je realna. Jedinica zadavanja je u sekundama.
00076     msgInterval3=inter;
00077 }
00078 void  can_initTX(char idtx){
00079     
00080     //Fukcija koja zadaje fiksnu adresu slanja poruke
00081     idTX1=idtx;
00082 }
00083 
00084 void  can_initTX1(char idtx){
00085     
00086     //Fukcija koja zadaje fiksnu adresu slanja poruke
00087     idTX1=idtx;
00088 }
00089 
00090 void  can_initTX2(char idtx){
00091     
00092     //Fukcija koja zadaje fiksnu adresu slanja poruke
00093     idTX2=idtx;
00094 }
00095 
00096 void  can_initTX3(char idtx){
00097     
00098     //Fukcija koja zadaje fiksnu adresu slanja poruke
00099     idTX3=idtx;
00100 }
00101 void can_msg_send(){
00102     
00103     /*
00104      *  Fukcija koja salje podatke na CAN mrezu po zadatom,setovanom, IDju. 
00105      *  Duzina poruke podesena je fiksno na 8B.
00106      */
00107     can.write(CANMessage((uint16_t)idTX1, data1, 8));
00108 }
00109 void can_msg_send1(){
00110     
00111     /*
00112      *  Fukcija koja salje podatke na CAN mrezu po zadatom,setovanom, IDju. 
00113      *  Duzina poruke podesena je fiksno na 8B.
00114      */
00115     can.write(CANMessage((uint16_t)idTX1, data1, 8));
00116 }
00117 void can_msg_send2(){
00118     
00119     /*
00120      *  Fukcija koja salje podatke na CAN mrezu po zadatom,setovanom, IDju. 
00121      *  Duzina poruke podesena je fiksno na 8B.
00122      */
00123     can.write(CANMessage((uint16_t)idTX2, data2, 8));
00124 }
00125 void can_msg_send3(){
00126     
00127     /*
00128      *  Fukcija koja salje podatke na CAN mrezu po zadatom,setovanom, IDju. 
00129      *  Duzina poruke podesena je fiksno na 8B.
00130      */
00131     can.write(CANMessage((uint16_t)idTX3, data3, 8));
00132 }
00133 
00134 void can_msg_send_tick(){
00135     
00136     //Funkcija koja se poziva za slanje poruka u okviru fiksnog intervala
00137     idTX=idTX1;
00138      //strcpy(data,data1);
00139     tick1.attach(can_msg_send1, msgInterval1);
00140 }
00141 void can_msg_send_tick1(){
00142     
00143     //Funkcija koja se poziva za slanje poruka u okviru fiksnog intervala
00144     idTX=idTX1;
00145      //strcpy(data,data1);
00146     tick1.attach(can_msg_send1, msgInterval1);
00147 }
00148 void can_msg_send_tick2(){
00149     
00150     //Funkcija koja se poziva za slanje poruka u okviru fiksnog intervala
00151     idTX=idTX2;
00152     //strcpy(data,data2);
00153     tick2.attach(can_msg_send2, msgInterval2);
00154 }
00155 void can_msg_send_tick3(){
00156     
00157     //Funkcija koja se poziva za slanje poruka u okviru fiksnog intervala
00158     idTX=idTX3;
00159     //strcpy(data,data3);
00160     tick3.attach(can_msg_send3, msgInterval3);
00161 }
00162 //----------------------------------------------------------------------------
00163 /*  Pomocne funkcije za pakovanje podataka prilikom slanja:
00164  *  Ove funkcije omogućavaju da automatsko pakovanje u razlicite velicine poruke 
00165  *  u zavisnosti od tipa i pozicije na kojoj treba poslati podatak.
00166  *
00167  *  Realizovane su za dva tipa: 
00168  *      -unit16_t (automatsko pakovanje u dva podatka od po 1B)
00169  *      -char
00170  * 
00171  *  Format: dta = vrednost koju saljemo kao podatak CANom, pos = pozicija u CAN
00172  *  poruci.
00173  * 
00174  *  CAN poruka: (IDslanja, DD7, DD6, DD5, DD4, DD3,DD2, DD1, DD0)
00175  *  Velicina podataka (DD7...DD0) je od po 1Byte.
00176  *  Maximalno se mogu poslati 4 podatka od po 2B (pos polje u opsegu od 0 do 3) 
00177  *  ili 8 od po 1B (pos polje u opsegu od 0 do 7). 
00178  */
00179 void pack_data(uint16_t dta, char pos){
00180     
00181     //Pakuje unit16_t u dva podatka od po 1B, na poziciji pos u CAN poruci
00182     data1[pos<<1] = dta;
00183     data1[(pos<<1)+1] = dta >> 8;
00184 }
00185 
00186 void pack_data1(uint16_t dta, char pos){
00187     
00188     //Pakuje unit16_t u dva podatka od po 1B, na poziciji pos u CAN poruci
00189     data1[pos<<1] = dta;
00190     data1[(pos<<1)+1] = dta >> 8;
00191 }
00192 
00193 void pack_data1(char dta, char pos){
00194      
00195      //Pakuje char u jedan podatka od 1B, na poziciji pos u CAN poruci
00196     data1[pos<<1] = dta;
00197 }
00198 
00199 void pack_data2(uint16_t dta, char pos){
00200     
00201     //Pakuje unit16_t u dva podatka od po 1B, na poziciji pos u CAN poruci
00202     data2[pos<<1] = dta;
00203     data2[(pos<<1)+1] = dta >> 8;
00204 }
00205 
00206 void pack_data2(char dta, char pos){
00207      
00208      //Pakuje char u jedan podatka od 1B, na poziciji pos u CAN poruci
00209     data2[pos<<1] = dta;
00210 }
00211 
00212 void pack_data3(uint16_t dta, char pos){
00213     
00214     //Pakuje unit16_t u dva podatka od po 1B, na poziciji pos u CAN poruci
00215     data3[pos<<1] = dta;
00216     data3[(pos<<1)+1] = dta >> 8;
00217 }
00218 
00219 void pack_data3(char dta, char pos){
00220      
00221      //Pakuje char u jedan podatka od 1B, na poziciji pos u CAN poruci
00222     data3[pos<<1] = dta;
00223 }
00224 
00225