drivers/win32/win32.c
changeset 697 24a2aec61731
parent 696 381af6bb6155
child 723 c33da109a4c8
equal deleted inserted replaced
696:381af6bb6155 697:24a2aec61731
     1 /*
     1 /*
     2 This file is part of CanFestival, a library implementing CanOpen Stack.
     2 This file is part of CanFestival, a library implementing CanOpen Stack.
     3 
     3 
     4 Copyright (C): Edouard TISSERANT and Francis DUPIN
     4 Copyright (C): Edouard TISSERANT and Francis DUPIN
     5 Copyright (C) Win32 Port Leonid Tochinski
     5 Copyright (C) Win32 Port Leonid Tochinski
       
     6 Modified by: Jaroslav Fojtik
     6 
     7 
     7 See COPYING file for copyrights details.
     8 See COPYING file for copyrights details.
     8 
     9 
     9 This library is free software; you can redistribute it and/or
    10 This library is free software; you can redistribute it and/or
    10 modify it under the terms of the GNU Lesser General Public
    11 modify it under the terms of the GNU Lesser General Public
   153 	}
   154 	}
   154 	return 1; /* NOT OK */	
   155 	return 1; /* NOT OK */	
   155 }
   156 }
   156 
   157 
   157 /***************************************************************************/
   158 /***************************************************************************/
   158 void canReceiveLoop(CAN_PORT port)
   159 DWORD canReceiveLoop(CAN_PORT port)
   159 {
   160 {
   160 	Message m;
   161 	Message m;
   161 	while(((CANPort*)port)->used)
   162 	while(((CANPort*)port)->used)
   162 	{
   163 	{
   163 		if(m_canReceive(((CANPort*)port)->fd, &m) != 0) break;
   164 		if(m_canReceive(((CANPort*)port)->fd, &m) != 0) continue;
   164 		EnterMutex();
   165 		EnterMutex();
   165 		canDispatch(((CANPort*)port)->d, &m);
   166 		canDispatch(((CANPort*)port)->d, &m);
   166 		LeaveMutex();
   167 		LeaveMutex();
   167 	}
   168 	}
       
   169 	return 0;
   168 }
   170 }
   169 
   171 
   170 /***************************************************************************/
   172 /***************************************************************************/
   171 CAN_HANDLE canOpen(s_BOARD *board, CO_Data * d)
   173 CAN_HANDLE canOpen(s_BOARD *board, CO_Data * d)
   172 {
   174 {
   173 	int i;
   175 	int i;
   174     CAN_HANDLE fd0;
   176 	CAN_HANDLE fd0;
       
   177 
       
   178 
       
   179 	  /* Fix of multiple opening one data set, added by J.Fojtik. */
       
   180 	if(d->canHandle)
       
   181 	{
       
   182 	  canClose(d);
       
   183 	}
   175 
   184 
   176 	for(i=0; i < MAX_NB_CAN_PORTS; i++)
   185 	for(i=0; i < MAX_NB_CAN_PORTS; i++)
   177 	{
   186 	{
   178 		if(!canports[i].used)
   187 		if(!canports[i].used)
   179 		break;
   188 		break;
   205 }
   214 }
   206 
   215 
   207 /***************************************************************************/
   216 /***************************************************************************/
   208 int canClose(CO_Data * d)
   217 int canClose(CO_Data * d)
   209 {
   218 {
   210 	UNS8 res = 1;
   219 	UNS8 res;
   211 	CANPort* tmp;
   220 	CANPort* tmp;
   212 
   221 
   213 	if((CANPort*)d->canHandle)
       
   214 	{
       
   215 	  ((CANPort*)d->canHandle)->used = 0;
       
   216 	}
       
   217 
       
   218 	tmp = (CANPort*)d->canHandle;
   222 	tmp = (CANPort*)d->canHandle;
   219 
   223 
   220 	if(tmp)
   224 	if(tmp)
   221 	{
   225 	{
   222 	  // kill receiver task before port is closed and handle set to NULL
   226 	  d->canHandle = NULL;
       
   227 
       
   228 		// close CAN port
       
   229 	  res = m_canClose(tmp->fd);
       
   230 
       
   231 		// kill receiver task
   223 	  WaitReceiveTaskEnd(&tmp->receiveTask);
   232 	  WaitReceiveTaskEnd(&tmp->receiveTask);
   224 
   233 
   225 	  // close CAN port
   234 		// release used flag as a last step.
   226 	  res = m_canClose(tmp->fd);
   235 	  tmp->used = 0;
   227 	}
   236 	}
   228 
   237   else res = 255;
   229 	d->canHandle = NULL;
   238 
   230 
   239 return res;
   231 	return res;
       
   232 }
   240 }
   233 
   241 
   234 UNS8 canChangeBaudRate(CAN_PORT port, char* baud)
   242 UNS8 canChangeBaudRate(CAN_PORT port, char* baud)
   235 {
   243 {
   236    if(port){
   244    if(port){