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

Reply via email to