Commit f0f851a5 authored by Sergi Hernandez's avatar Sergi Hernandez
Browse files

Changed the name of the get_num_bytes() function to get_num_data().

Changed the map of data queues to use a pointer.
Added a new map for the new data events.
Both maps are updated with the add_filter and clear_filter functions.
parent bbc0f273
......@@ -46,7 +46,8 @@ class CCAN : protected CComm
int num_filters;
CMutex can_access;
// map of ID/data pair
std::map<unsigned int, CQueue> can_messages_map;
std::map<unsigned int, CQueue *> can_data_map;
std::map<unsigned int, std::string> can_event_map;
protected:
/**
* \brief Function to actually open the device
......@@ -207,6 +208,10 @@ class CCAN : protected CComm
* \brief
*/
std::string get_new_frame_event_id(void);
/**
* \brief
*/
std::string get_new_frame_event_id(unsigned int can_id);
/**
* \brief
*/
......@@ -234,7 +239,7 @@ class CCAN : protected CComm
/**
* \brief
*/
unsigned int get_num_bytes(unsigned int can_id);
unsigned int get_num_data(unsigned int can_id);
/**
* \brief
*/
......
......@@ -176,7 +176,7 @@ void *CCAN::can_thread(void *param)
{
can->can_access.enter();
// process the incomming data
num=can->get_num_data();
num=((CComm *)can)->get_num_data();
while(num>=sizeof(struct can_frame))// there is a whole frame in the input buffer
{
can->CComm::read((unsigned char *)&new_frame,sizeof(struct can_frame));
......@@ -191,14 +191,15 @@ void *CCAN::can_thread(void *param)
{
//push the new frame into the queue
can->rx_frames.push(new_frame);
can->can_messages_map[new_frame.can_id].write(new_frame.data,new_frame.can_dlc);
can->can_data_map[new_frame.can_id]->write(new_frame.data,new_frame.can_dlc);
//for (unsigned int i=0; i<new_frame.can_dlc; i++)
// can->can_messages_map[new_frame.can_id].push_back(new_frame.data[i]);
// can->can_data_map[new_frame.can_id].push_back(new_frame.data[i]);
// activate the event
can->event_server->set_event(can->new_frame_event_id);
can->event_server->set_event((std::to_string(new_frame.can_id) + "_new_data_event_id"));
}
num-=sizeof(struct can_frame);
num=((CComm *)can)->get_num_data();
//num-=sizeof(struct can_frame);
}
can->can_access.exit();
}
......@@ -218,6 +219,13 @@ std::string CCAN::get_new_frame_event_id(void)
return this->new_frame_event_id;
}
std::string CCAN::get_new_frame_event_id(unsigned int can_id)
{
if(this->can_event_map.find(can_id)==this->can_event_map.end())
throw CCommException(_HERE_,"Invalid can ID",this->comm_id);
return this->can_event_map[can_id];
}
std::string CCAN::get_frame_error_event_id(void)
{
return this->frame_error_event_id;
......@@ -272,13 +280,10 @@ void CCAN::write(unsigned int can_id, unsigned char *data, int len)
void CCAN::read(unsigned int can_id, unsigned char *data, int len)
{
struct can_frame frame;
int i=0;
this->can_access.enter();
if(!this->can_messages_map[can_id].is_empty())
if(!this->can_data_map[can_id]->is_empty())
{
this->can_messages_map[can_id].read(data,len);
this->can_data_map[can_id]->read(data,len);
}
else
{
......@@ -289,11 +294,16 @@ void CCAN::read(unsigned int can_id, unsigned char *data, int len)
this->can_access.exit();
}
unsigned int CCAN::get_num_bytes(unsigned int can_id)
unsigned int CCAN::get_num_data(unsigned int can_id)
{
unsigned int num_of_frames = this->can_messages_map[can_id].get_num_data();
unsigned int num_data;
if(this->can_data_map.find(can_id)==this->can_data_map.end())
throw CCommException(_HERE_,"Invalid can ID",this->comm_id);
num_data = this->can_data_map[can_id]->get_num_data();
return num_of_frames;
return num_data;
}
std::string CCAN::add_id_filter(unsigned short int can_id)
......@@ -325,10 +335,11 @@ std::string CCAN::add_id_filter(unsigned short int can_id)
/* handle exceptions */
throw CCommException(_HERE_,"Error while setting up the filters",this->comm_id);
}
std::string event_id=std::to_string(can_id) + "_new_data_event_id";
this->event_server->create_event(event_id);
this->can_data_map[can_id]=new CQueue();
this->can_event_map[can_id]=std::to_string(can_id) + "_new_data_event_id";
this->event_server->create_event(this->can_event_map[can_id]);
return event_id;
return this->can_event_map[can_id];
}
std::string CCAN::add_id_filter(unsigned short int can_id,unsigned short int mask)
......@@ -361,14 +372,18 @@ std::string CCAN::add_id_filter(unsigned short int can_id,unsigned short int mas
throw CCommException(_HERE_,"Error while setting up the filters",this->comm_id);
}
std::string event_id=std::to_string(can_id) + "_new_data_event_id";
this->event_server->create_event(event_id);
this->can_data_map[can_id]=new CQueue();
this->can_event_map[can_id]=std::to_string(can_id) + "_new_data_event_id";
this->event_server->create_event(this->can_event_map[can_id]);
return event_id;
return this->can_event_map[can_id];
}
void CCAN::clear_id_filters(void)
{
std::map<unsigned int,std::string>::iterator it;
std::map<unsigned int,CQueue *>::iterator data_it;
if(this->rx_filters!=NULL)
{
delete this->rx_filters;
......@@ -380,6 +395,11 @@ void CCAN::clear_id_filters(void)
/* handle exceptions */
throw CCommException(_HERE_,"Error while clearing the existing filters",this->comm_id);
}
for(it=this->can_event_map.begin();it!=this->can_event_map.end();it++)
this->event_server->delete_event(it->second);
for(data_it=this->can_data_map.begin();data_it!=this->can_data_map.end();data_it++)
delete data_it->second;
}
void CCAN::close(void)
......@@ -390,6 +410,9 @@ void CCAN::close(void)
CCAN::~CCAN()
{
std::map<unsigned int,std::string>::iterator it;
std::map<unsigned int,CQueue *>::iterator data_it;
// close the can device
if(this->can_socket_fd!=-1)
CComm::close();
......@@ -419,5 +442,9 @@ CCAN::~CCAN()
this->event_server->delete_event(this->data_requested_event_id);
this->data_requested_event_id="";
}
for(it=this->can_event_map.begin();it!=this->can_event_map.end();it++)
this->event_server->delete_event(it->second);
for(data_it=this->can_data_map.begin();data_it!=this->can_data_map.end();data_it++)
delete data_it->second;
}
......@@ -33,7 +33,7 @@ int main(int argc,char *argv[])
{
event_server->wait_all(events);
std::cout << "[" << std::dec << can_port.get_last_rx_timestamp() << "]" << std::endl;
len = can_port.get_num_bytes(can_id);
len = can_port.get_num_data(can_id);
can_port.read(can_id,data,len);
std::cout << "can id: 0x" << std::hex << can_id << std::endl;
std::cout << "length: " << len << std::endl;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment