>
> Hi
My problem is solved it was because of not handling receive request before
send
I added my edited codes (candev.cpp and candev.h )
>
#ifndef CANDEV_H
#define CANDEV_H
#include <string.h>
#include <stdlib.h>
#include <queue>
#include <map>
#include <iostream>
#include <pthread.h>
#include "canBus.h"
#include "definition.h"
using namespace std;
class canBus;
class canDev
{
public:
canDev(const int &nodeID);
virtual ~canDev();
UNS8 canReceive_driver(Message_ *m);
UNS8 canSend_driver(const Message_ *m);
int TranslateBaudRate(char* optarg);
UNS8 canChangeBaudRate_driver(CAN_HANDLE fd0, char *baud);
CAN_HANDLE canOpen_driver(s_BOARD_ *board);
int canClose_driver(CAN_HANDLE fd0);
void canSetBus(canBus *Bus);
int getNodeID()const;
void setMsgBuffer(Message_ *m);
void AddNewBus(char *baudrate, canBus* cBus);
bool IsBusPresent(char *baudrate);
canBus * GetBusAddress(char *baudrate);
static map<char *, canBus *> BusesMap;
static int ID;
pthread_mutex_t mutex;
pthread_cond_t cond;
protected:
private:
canBus *Bus;
int nodeID;
s_BOARD_ *board;
queue<Message_ *>buffer;
};
#endif // CANDEV_H
#include "candev.h"
std::map<char *, canBus *> canDev::BusesMap;
int canDev::ID = 0;
canDev::canDev(const int &nodeID)
{
this->nodeID = ID;
pthread_cond_init(&cond, NULL);
pthread_mutex_init(&mutex, NULL);
ID++;
//ctor
}
canDev::~canDev()
{
pthread_cond_destroy(&cond);
pthread_mutex_destroy(&mutex);
//dtor
}
void canDev::canSetBus(canBus *Bus)
{
if(this->Bus != Bus && this->Bus != NULL)
{
this->Bus->removeDev(this);
}
this->Bus = Bus;
this->Bus->registerDev(this);
this->board->busname = this->Bus->GetBusName();
this->board->baudrate = this->Bus->GetBuadRate();
}
UNS8 canDev::canReceive_driver(Message_ *m)
{
pthread_mutex_lock(&mutex);
if (buffer.empty())
{
pthread_cond_wait(&cond, &mutex);
pthread_mutex_unlock(&mutex);
}
Message_ * temp = buffer.front();
m->cob_id = (temp)->cob_id;
memcpy(m->data, (temp)->data,8);
m->len = (temp)->len;
m->rtr = (temp)->rtr;
buffer.pop();
delete temp;
return 0;
}
UNS8 canDev::canSend_driver(const Message_ *m)
{
this->Bus->sendMessage(this, m);
return 0;
}
int canDev::TranslateBaudRate(char *optarg)
{
if (!strcmp(optarg, "1M"))
return (int)1000;
if (!strcmp(optarg, "500K"))
return (int)500;
if (!strcmp(optarg, "250K"))
return (int)250;
if (!strcmp(optarg, "125K"))
return (int)125;
if (!strcmp(optarg, "100K"))
return (int)100;
if (!strcmp(optarg, "50K"))
return (int)50;
if (!strcmp(optarg, "20K"))
return (int)20;
if (!strcmp(optarg, "10K"))
return (int)10;
if (!strcmp(optarg, "5K"))
return (int)5;
if (!strcmp(optarg, "none"))
return 0;
return 0x0000;
}
UNS8 canDev::canChangeBaudRate_driver( CAN_HANDLE fd0, char *baud)
{
printf("Faked changing to baud rate %s[%d]\n", baud, TranslateBaudRate(baud));
return 0;
}
CAN_HANDLE canDev::canOpen_driver(s_BOARD_ *board)
{
Bus = new canBus();
Bus = NULL;
this->board = new s_BOARD_;
this->board->baudrate = board->baudrate;
this->board->busname = board->busname;
return NULL;
}
int canDev::canClose_driver(CAN_HANDLE fd0)
{
this->Bus->removeDev(this);
return 0;
}
int canDev::getNodeID()const
{
return nodeID;
}
void canDev::setMsgBuffer(Message_ *m)
{
Message_ * temp = new Message_;
temp->cob_id = m->cob_id;
memcpy(temp->data, m->data, 8);
temp->len = m->len;
temp->rtr = m->rtr;
buffer.push(temp);
pthread_cond_signal(&cond);
}
void canDev::AddNewBus(char * baudrate, canBus * cBus)
{
BusesMap[baudrate] = cBus;
}
bool canDev::IsBusPresent(char * baudrate)
{
if (BusesMap.empty())
return false;
map<char *, canBus *>::iterator it;
it = BusesMap.find(baudrate);
if (it == BusesMap.end())
{
return false;
}
return true;
}
canBus * canDev::GetBusAddress(char *baudrate)
{
map<char *, canBus *>::iterator it;
it = BusesMap.find(baudrate);
return (*it).second;
}
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Canfestival-devel mailing list
Canfestival-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/canfestival-devel