drivers/win32/win32.c
author fbeaulier
Tue, 16 Aug 2011 14:15:52 +0200
changeset 663 70fc3603e36f
parent 652 3b5789c34499
child 687 e23df9586397
permissions -rwxr-xr-x
timers_unix.c : remove sigint and sigterm catch
sdo : Allow multiple servers
The sdo transfer struct is not anymore referenced by server's node id but by
client or server number in the OD. Node id is not relevant in SDO transfert.
556
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
     1
/*
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
     2
This file is part of CanFestival, a library implementing CanOpen Stack.
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
     3
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
     4
Copyright (C): Edouard TISSERANT and Francis DUPIN
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
     5
Copyright (C) Win32 Port Leonid Tochinski
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
     6
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
     7
See COPYING file for copyrights details.
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
     8
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
     9
This library is free software; you can redistribute it and/or
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    10
modify it under the terms of the GNU Lesser General Public
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    11
License as published by the Free Software Foundation; either
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    12
version 2.1 of the License, or (at your option) any later version.
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    13
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    14
This library is distributed in the hope that it will be useful,
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    15
but WITHOUT ANY WARRANTY; without even the implied warranty of
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    16
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    17
Lesser General Public License for more details.
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    18
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    19
You should have received a copy of the GNU Lesser General Public
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    20
License along with this library; if not, write to the Free Software
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    21
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    22
*/
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    23
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    24
/*
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    25
 CAN driver interface.
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    26
*/
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    27
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    28
#include <windows.h>
591
513f5ec8b628 add extern C to maintain compatibility with C++
greg
parents: 577
diff changeset
    29
513f5ec8b628 add extern C to maintain compatibility with C++
greg
parents: 577
diff changeset
    30
#ifdef __cplusplus
513f5ec8b628 add extern C to maintain compatibility with C++
greg
parents: 577
diff changeset
    31
extern "C" {
513f5ec8b628 add extern C to maintain compatibility with C++
greg
parents: 577
diff changeset
    32
#endif
513f5ec8b628 add extern C to maintain compatibility with C++
greg
parents: 577
diff changeset
    33
556
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    34
#include "canfestival.h"
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    35
#include "timer.h"
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    36
#include "timers_driver.h"
591
513f5ec8b628 add extern C to maintain compatibility with C++
greg
parents: 577
diff changeset
    37
513f5ec8b628 add extern C to maintain compatibility with C++
greg
parents: 577
diff changeset
    38
#ifdef __cplusplus
577
0bb82be64630 add extern \"C\" to keep compatibilty with C++
greg
parents: 556
diff changeset
    39
};
591
513f5ec8b628 add extern C to maintain compatibility with C++
greg
parents: 577
diff changeset
    40
#endif
513f5ec8b628 add extern C to maintain compatibility with C++
greg
parents: 577
diff changeset
    41
556
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    42
// GetProcAddress doesn't have an UNICODE version for NT
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    43
#ifdef UNDER_CE
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    44
  #define myTEXT(str) TEXT(str)
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    45
#else
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    46
  #define myTEXT(str) str
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    47
#endif
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    48
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    49
#define MAX_NB_CAN_PORTS 16
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    50
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    51
typedef UNS8 (CALLBACK* CANRECEIVE_DRIVER_PROC)(void* inst, Message *m);
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    52
typedef UNS8 (CALLBACK* CANSEND_DRIVER_PROC)(void* inst, const Message *m);
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    53
typedef void* (CALLBACK* CANOPEN_DRIVER_PROC)(s_BOARD *board);
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    54
typedef int (CALLBACK* CANCLOSE_DRIVER_PROC)(void* inst);
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    55
typedef UNS8 (CALLBACK* CANCHANGEBAUDRATE_DRIVER_PROC)(void* fd, char* baud);
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    56
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    57
CANRECEIVE_DRIVER_PROC m_canReceive;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    58
CANSEND_DRIVER_PROC m_canSend;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    59
CANOPEN_DRIVER_PROC m_canOpen;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    60
CANCLOSE_DRIVER_PROC m_canClose;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    61
CANCHANGEBAUDRATE_DRIVER_PROC m_canChangeBaudRate;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    62
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    63
/* CAN port structure */
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    64
typedef struct
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    65
{
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    66
  char used;  /**< flag indicating CAN port usage, will be used to abort Receiver task*/
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    67
  CAN_HANDLE fd; /**< CAN port file descriptor*/
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    68
  TASK_HANDLE receiveTask; /**< CAN Receiver task*/
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    69
  CO_Data* d; /**< CAN object data*/
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    70
}CANPort;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    71
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    72
CANPort canports[MAX_NB_CAN_PORTS] = {{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,}};
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    73
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    74
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    75
/***************************************************************************/
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    76
UNS8 UnLoadCanDriver(LIB_HANDLE handle)
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    77
{
638
00bc03cb5606 CHANGED: - option to integrate a can driver statically (hack)
Christian Taedcke
parents: 629
diff changeset
    78
#ifndef NOT_USE_DYNAMIC_LOADING
556
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    79
	if(handle != NULL)
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    80
	{
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    81
		FreeLibrary(handle);
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    82
		handle=NULL;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    83
		return 0;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    84
	}
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    85
	return -1;
638
00bc03cb5606 CHANGED: - option to integrate a can driver statically (hack)
Christian Taedcke
parents: 629
diff changeset
    86
#else
00bc03cb5606 CHANGED: - option to integrate a can driver statically (hack)
Christian Taedcke
parents: 629
diff changeset
    87
  handle = NULL;
00bc03cb5606 CHANGED: - option to integrate a can driver statically (hack)
Christian Taedcke
parents: 629
diff changeset
    88
  return 0;
00bc03cb5606 CHANGED: - option to integrate a can driver statically (hack)
Christian Taedcke
parents: 629
diff changeset
    89
#endif //NOT_USE_DYNAMIC_LOADING
556
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    90
}
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    91
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    92
/***************************************************************************/
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    93
/**
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    94
 * Loads the dll and get funcs ptr
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    95
 *
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    96
 * @param driver_name String containing driver's dynamic library name
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    97
 * @return Library handle
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    98
 */
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    99
LIB_HANDLE LoadCanDriver(LPCTSTR driver_name)
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   100
{
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   101
	// driver module handle
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   102
	LIB_HANDLE handle = NULL;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   103
638
00bc03cb5606 CHANGED: - option to integrate a can driver statically (hack)
Christian Taedcke
parents: 629
diff changeset
   104
#ifndef NOT_USE_DYNAMIC_LOADING
556
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   105
	if(handle == NULL)
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   106
	{
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   107
		handle = LoadLibrary(driver_name);
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   108
	}
577
0bb82be64630 add extern \"C\" to keep compatibilty with C++
greg
parents: 556
diff changeset
   109
0bb82be64630 add extern \"C\" to keep compatibilty with C++
greg
parents: 556
diff changeset
   110
	if (!handle)
556
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   111
	{
600
7767029937aa add timeout for waitreceivetaskend for the win32, fix GetLastError print
'Gr?gory Tr?lat <gregory.trelat@lolitech.fr>'
parents: 591
diff changeset
   112
		fprintf (stderr, "%d\n", GetLastError());
556
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   113
    	return NULL;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   114
	}
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   115
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   116
	m_canReceive = (CANRECEIVE_DRIVER_PROC)GetProcAddress(handle, myTEXT("canReceive_driver"));
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   117
	m_canSend = (CANSEND_DRIVER_PROC)GetProcAddress(handle, myTEXT("canSend_driver"));
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   118
	m_canOpen = (CANOPEN_DRIVER_PROC)GetProcAddress(handle, myTEXT("canOpen_driver"));
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   119
	m_canClose = (CANCLOSE_DRIVER_PROC)GetProcAddress(handle, myTEXT("canClose_driver"));
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   120
	m_canChangeBaudRate = (CANCHANGEBAUDRATE_DRIVER_PROC)GetProcAddress(handle, myTEXT("canChangeBaudRate_driver"));
638
00bc03cb5606 CHANGED: - option to integrate a can driver statically (hack)
Christian Taedcke
parents: 629
diff changeset
   121
#else
00bc03cb5606 CHANGED: - option to integrate a can driver statically (hack)
Christian Taedcke
parents: 629
diff changeset
   122
  //compiled in...
00bc03cb5606 CHANGED: - option to integrate a can driver statically (hack)
Christian Taedcke
parents: 629
diff changeset
   123
  handle = 1; //TODO: remove this hack
00bc03cb5606 CHANGED: - option to integrate a can driver statically (hack)
Christian Taedcke
parents: 629
diff changeset
   124
00bc03cb5606 CHANGED: - option to integrate a can driver statically (hack)
Christian Taedcke
parents: 629
diff changeset
   125
  m_canReceive = canReceive_driver;
00bc03cb5606 CHANGED: - option to integrate a can driver statically (hack)
Christian Taedcke
parents: 629
diff changeset
   126
	m_canSend = canSend_driver;
00bc03cb5606 CHANGED: - option to integrate a can driver statically (hack)
Christian Taedcke
parents: 629
diff changeset
   127
	m_canOpen = canOpen_driver;
00bc03cb5606 CHANGED: - option to integrate a can driver statically (hack)
Christian Taedcke
parents: 629
diff changeset
   128
	m_canClose = canClose_driver;
00bc03cb5606 CHANGED: - option to integrate a can driver statically (hack)
Christian Taedcke
parents: 629
diff changeset
   129
	m_canChangeBaudRate = canChangeBaudRate_driver;
00bc03cb5606 CHANGED: - option to integrate a can driver statically (hack)
Christian Taedcke
parents: 629
diff changeset
   130
#endif
00bc03cb5606 CHANGED: - option to integrate a can driver statically (hack)
Christian Taedcke
parents: 629
diff changeset
   131
577
0bb82be64630 add extern \"C\" to keep compatibilty with C++
greg
parents: 556
diff changeset
   132
556
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   133
	return handle;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   134
}
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   135
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   136
/***************************************************************************/
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   137
UNS8 canSend(CAN_PORT port, Message *m)
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   138
{
652
3b5789c34499 FIXED: - OK and NOT OK was wrong in canSend()
Christian Taedcke <Christian.Taedcke@ica-traffic.de>
parents: 638
diff changeset
   139
	UNS8 res = 1; //NOT OK
556
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   140
	if (port && (m_canSend != NULL))
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   141
	{
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   142
		res = m_canSend(((CANPort*)port)->fd, m);
652
3b5789c34499 FIXED: - OK and NOT OK was wrong in canSend()
Christian Taedcke <Christian.Taedcke@ica-traffic.de>
parents: 638
diff changeset
   143
	}
3b5789c34499 FIXED: - OK and NOT OK was wrong in canSend()
Christian Taedcke <Christian.Taedcke@ica-traffic.de>
parents: 638
diff changeset
   144
	return res;
556
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   145
}
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   146
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   147
/***************************************************************************/
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   148
void canReceiveLoop(CAN_PORT port)
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   149
{
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   150
	Message m;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   151
	while(((CANPort*)port)->used)
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   152
	{
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   153
		if(m_canReceive(((CANPort*)port)->fd, &m) != 0) break;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   154
		EnterMutex();
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   155
		canDispatch(((CANPort*)port)->d, &m);
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   156
		LeaveMutex();
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   157
	}
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   158
}
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   159
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   160
/***************************************************************************/
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   161
CAN_HANDLE canOpen(s_BOARD *board, CO_Data * d)
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   162
{
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   163
	int i;
591
513f5ec8b628 add extern C to maintain compatibility with C++
greg
parents: 577
diff changeset
   164
    CAN_HANDLE fd0;
513f5ec8b628 add extern C to maintain compatibility with C++
greg
parents: 577
diff changeset
   165
556
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   166
	for(i=0; i < MAX_NB_CAN_PORTS; i++)
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   167
	{
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   168
		if(!canports[i].used)
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   169
		break;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   170
	}
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   171
577
0bb82be64630 add extern \"C\" to keep compatibilty with C++
greg
parents: 556
diff changeset
   172
	#ifndef NOT_USE_DYNAMIC_LOADING
556
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   173
	if (m_canOpen == NULL)
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   174
	{
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   175
	   	fprintf(stderr,"CanOpen : Can Driver dll not loaded\n");
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   176
	   	return NULL;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   177
	}
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   178
	#endif
577
0bb82be64630 add extern \"C\" to keep compatibilty with C++
greg
parents: 556
diff changeset
   179
591
513f5ec8b628 add extern C to maintain compatibility with C++
greg
parents: 577
diff changeset
   180
	fd0 = m_canOpen(board);
556
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   181
	if(fd0)
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   182
	{
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   183
		canports[i].used = 1;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   184
		canports[i].fd = fd0;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   185
		canports[i].d = d;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   186
		d->canHandle = (CAN_PORT)&canports[i];
577
0bb82be64630 add extern \"C\" to keep compatibilty with C++
greg
parents: 556
diff changeset
   187
		CreateReceiveTask(&(canports[i]), &canports[i].receiveTask, (void *)canReceiveLoop);
556
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   188
		return (CAN_PORT)&canports[i];
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   189
	}
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   190
	else
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   191
	{
638
00bc03cb5606 CHANGED: - option to integrate a can driver statically (hack)
Christian Taedcke
parents: 629
diff changeset
   192
		MSG(("CanOpen : Cannot open board {busname='%s',baudrate='%s'}\n",board->busname, board->baudrate));
556
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   193
		return NULL;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   194
	}
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   195
}
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   196
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   197
/***************************************************************************/
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   198
int canClose(CO_Data * d)
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   199
{
600
7767029937aa add timeout for waitreceivetaskend for the win32, fix GetLastError print
'Gr?gory Tr?lat <gregory.trelat@lolitech.fr>'
parents: 591
diff changeset
   200
	UNS8 res = 1;
591
513f5ec8b628 add extern C to maintain compatibility with C++
greg
parents: 577
diff changeset
   201
	CANPort* tmp;
513f5ec8b628 add extern C to maintain compatibility with C++
greg
parents: 577
diff changeset
   202
513f5ec8b628 add extern C to maintain compatibility with C++
greg
parents: 577
diff changeset
   203
	if((CANPort*)d->canHandle)
513f5ec8b628 add extern C to maintain compatibility with C++
greg
parents: 577
diff changeset
   204
	{
513f5ec8b628 add extern C to maintain compatibility with C++
greg
parents: 577
diff changeset
   205
	  ((CANPort*)d->canHandle)->used = 0;
513f5ec8b628 add extern C to maintain compatibility with C++
greg
parents: 577
diff changeset
   206
	}
513f5ec8b628 add extern C to maintain compatibility with C++
greg
parents: 577
diff changeset
   207
513f5ec8b628 add extern C to maintain compatibility with C++
greg
parents: 577
diff changeset
   208
	tmp = (CANPort*)d->canHandle;
577
0bb82be64630 add extern \"C\" to keep compatibilty with C++
greg
parents: 556
diff changeset
   209
591
513f5ec8b628 add extern C to maintain compatibility with C++
greg
parents: 577
diff changeset
   210
	if(tmp)
513f5ec8b628 add extern C to maintain compatibility with C++
greg
parents: 577
diff changeset
   211
	{
629
b9274b595650 CosateQ contribution.
edouard
parents: 600
diff changeset
   212
	  // kill receiver task before port is closed and handle set to NULL
b9274b595650 CosateQ contribution.
edouard
parents: 600
diff changeset
   213
	  WaitReceiveTaskEnd(&tmp->receiveTask);
b9274b595650 CosateQ contribution.
edouard
parents: 600
diff changeset
   214
591
513f5ec8b628 add extern C to maintain compatibility with C++
greg
parents: 577
diff changeset
   215
	  // close CAN port
513f5ec8b628 add extern C to maintain compatibility with C++
greg
parents: 577
diff changeset
   216
	  res = m_canClose(tmp->fd);
629
b9274b595650 CosateQ contribution.
edouard
parents: 600
diff changeset
   217
	}
b9274b595650 CosateQ contribution.
edouard
parents: 600
diff changeset
   218
b9274b595650 CosateQ contribution.
edouard
parents: 600
diff changeset
   219
	d->canHandle = NULL;
b9274b595650 CosateQ contribution.
edouard
parents: 600
diff changeset
   220
556
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   221
	return res;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   222
}
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   223
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   224
UNS8 canChangeBaudRate(CAN_PORT port, char* baud)
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   225
{
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   226
   if(port){
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   227
		UNS8 res;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   228
	    //LeaveMutex();
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   229
		res = m_canChangeBaudRate(((CANPort*)port)->fd, baud);
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   230
		//EnterMutex();
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   231
		return res; // OK
577
0bb82be64630 add extern \"C\" to keep compatibilty with C++
greg
parents: 556
diff changeset
   232
	}
556
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   233
	return 1; // NOT OK
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   234
}
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   235