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
- Committer:
- renemagrit
- Date:
- 2019-12-11
- Revision:
- 4:b42c40844d4c
- Parent:
- 3:a142cf0e7c37
File content as of revision 4:b42c40844d4c:
#include "CANlibrary.h" extern CAN can; extern Serial pc; Ticker tick1; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!! nije hteo da se prevede kao extern Ticker tick2; Ticker tick3; /****************************************** - - - - - VAZNO! - - - - - IDjevi se tumace u decimalnom brojnom sistemu - can_flag niz treba namestiti adrese da idu u u intervalu od 0-15 celobrojno - tj, mogle bi da se i koriste one od 2000h ali tipa da to se oduzima nekom celobrojom konstantom koja ce davati oseg adresa od 0 do 15 */ bool can_flag[16]; CANMessage msgs[16]; char data[8],data1[8],data2[8],data3[8]; char idTX=0,idTX1=0,idTX2=0,idTX3=0; float msgInterval1=0,msgInterval2=0,msgInterval3=0; void can_initRX(){ can.attach(can_msg_receive, CAN::RxIrq); } void can_msg_receive(){ // CAN RX Interrupt Function CANMessage tmpMsg; if (can.read(tmpMsg)) { //Detect message can_flag[tmpMsg.id]=true; msgs[tmpMsg.id%16]=tmpMsg; } }; uint16_t get_data(char id, char indeks){ return msgs[id].data[indeks<<1] | (msgs[id].data[(indeks << 1) + 1] << 8); } bool check_flag(char id){ bool ret = can_flag[id]; can_flag[id]=false; return ret; } //------------------------------------------------------------------- //------------------------------------------------------------------- // Funkcije slanja poruka: void canTX_set_Interval(float inter){ //Zadavanje fiksnog intervala slanja CAN poruke //Vrednost je realna. Jedinica zadavanja je u sekundama. msgInterval1=inter; } void canTX_set_Interval_1(float inter){ //Zadavanje fiksnog intervala slanja CAN poruke //Vrednost je realna. Jedinica zadavanja je u sekundama. msgInterval1=inter; } void canTX_set_Interval_2(float inter){ //Zadavanje fiksnog intervala slanja CAN poruke //Vrednost je realna. Jedinica zadavanja je u sekundama. msgInterval2=inter; } void canTX_set_Interval_3(float inter){ //Zadavanje fiksnog intervala slanja CAN poruke //Vrednost je realna. Jedinica zadavanja je u sekundama. msgInterval3=inter; } void can_initTX(char idtx){ //Fukcija koja zadaje fiksnu adresu slanja poruke idTX1=idtx; } void can_initTX1(char idtx){ //Fukcija koja zadaje fiksnu adresu slanja poruke idTX1=idtx; } void can_initTX2(char idtx){ //Fukcija koja zadaje fiksnu adresu slanja poruke idTX2=idtx; } void can_initTX3(char idtx){ //Fukcija koja zadaje fiksnu adresu slanja poruke idTX3=idtx; } void can_msg_send(){ /* * Fukcija koja salje podatke na CAN mrezu po zadatom,setovanom, IDju. * Duzina poruke podesena je fiksno na 8B. */ can.write(CANMessage((uint16_t)idTX1, data1, 8)); } void can_msg_send1(){ /* * Fukcija koja salje podatke na CAN mrezu po zadatom,setovanom, IDju. * Duzina poruke podesena je fiksno na 8B. */ can.write(CANMessage((uint16_t)idTX1, data1, 8)); } void can_msg_send2(){ /* * Fukcija koja salje podatke na CAN mrezu po zadatom,setovanom, IDju. * Duzina poruke podesena je fiksno na 8B. */ can.write(CANMessage((uint16_t)idTX2, data2, 8)); } void can_msg_send3(){ /* * Fukcija koja salje podatke na CAN mrezu po zadatom,setovanom, IDju. * Duzina poruke podesena je fiksno na 8B. */ can.write(CANMessage((uint16_t)idTX3, data3, 8)); } void can_msg_send_tick(){ //Funkcija koja se poziva za slanje poruka u okviru fiksnog intervala idTX=idTX1; //strcpy(data,data1); tick1.attach(can_msg_send1, msgInterval1); } void can_msg_send_tick1(){ //Funkcija koja se poziva za slanje poruka u okviru fiksnog intervala idTX=idTX1; //strcpy(data,data1); tick1.attach(can_msg_send1, msgInterval1); } void can_msg_send_tick2(){ //Funkcija koja se poziva za slanje poruka u okviru fiksnog intervala idTX=idTX2; //strcpy(data,data2); tick2.attach(can_msg_send2, msgInterval2); } void can_msg_send_tick3(){ //Funkcija koja se poziva za slanje poruka u okviru fiksnog intervala idTX=idTX3; //strcpy(data,data3); tick3.attach(can_msg_send3, msgInterval3); } //---------------------------------------------------------------------------- /* Pomocne funkcije za pakovanje podataka prilikom slanja: * Ove funkcije omogućavaju da automatsko pakovanje u razlicite velicine poruke * u zavisnosti od tipa i pozicije na kojoj treba poslati podatak. * * Realizovane su za dva tipa: * -unit16_t (automatsko pakovanje u dva podatka od po 1B) * -char * * Format: dta = vrednost koju saljemo kao podatak CANom, pos = pozicija u CAN * poruci. * * CAN poruka: (IDslanja, DD7, DD6, DD5, DD4, DD3,DD2, DD1, DD0) * Velicina podataka (DD7...DD0) je od po 1Byte. * Maximalno se mogu poslati 4 podatka od po 2B (pos polje u opsegu od 0 do 3) * ili 8 od po 1B (pos polje u opsegu od 0 do 7). */ void pack_data(uint16_t dta, char pos){ //Pakuje unit16_t u dva podatka od po 1B, na poziciji pos u CAN poruci data1[pos<<1] = dta; data1[(pos<<1)+1] = dta >> 8; } void pack_data1(uint16_t dta, char pos){ //Pakuje unit16_t u dva podatka od po 1B, na poziciji pos u CAN poruci data1[pos<<1] = dta; data1[(pos<<1)+1] = dta >> 8; } void pack_data1(char dta, char pos){ //Pakuje char u jedan podatka od 1B, na poziciji pos u CAN poruci data1[pos<<1] = dta; } void pack_data2(uint16_t dta, char pos){ //Pakuje unit16_t u dva podatka od po 1B, na poziciji pos u CAN poruci data2[pos<<1] = dta; data2[(pos<<1)+1] = dta >> 8; } void pack_data2(char dta, char pos){ //Pakuje char u jedan podatka od 1B, na poziciji pos u CAN poruci data2[pos<<1] = dta; } void pack_data3(uint16_t dta, char pos){ //Pakuje unit16_t u dva podatka od po 1B, na poziciji pos u CAN poruci data3[pos<<1] = dta; data3[(pos<<1)+1] = dta >> 8; } void pack_data3(char dta, char pos){ //Pakuje char u jedan podatka od 1B, na poziciji pos u CAN poruci data3[pos<<1] = dta; }