Stefan Sofijanić / CANlibrary

Dependents:   IntegrationCAN_03apr_FSRA2019

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