# HG changeset patch # User leonid # Date 1186530182 -7200 # Node ID b0dd37421d28aef576d9e39eb8aec85f2d9f0937 # Parent cab66ef3e68eb98ae6fd0a7dd453271dbf4e60c5 *** empty log message *** diff -r cab66ef3e68e -r b0dd37421d28 CanFestival-3.vc8.sln --- a/CanFestival-3.vc8.sln Tue Aug 07 17:18:03 2007 +0200 +++ b/CanFestival-3.vc8.sln Wed Aug 08 01:43:02 2007 +0200 @@ -1,64 +1,53 @@  Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual C++ Express 2005 +# Visual Studio 2005 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CanFestival-3", "CanFestival-3.vc8.vcproj", "{50EF2507-9B87-4525-8B19-80EB42E67079}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "can_uvccm_win32", "drivers\can_uvccm_win32\can_uvccm_win32.vcproj", "{39E3300A-29B4-4AA7-AF62-3B181FC26155}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "win32test", "examples\win32test\win32test.vcproj", "{BD8B1FE1-89CD-4F89-8275-0F553FA71059}" + ProjectSection(ProjectDependencies) = postProject + {50EF2507-9B87-4525-8B19-80EB42E67079} = {50EF2507-9B87-4525-8B19-80EB42E67079} + {39E3300A-29B4-4AA7-AF62-3B181FC26155} = {39E3300A-29B4-4AA7-AF62-3B181FC26155} + {8F57E7FF-1B73-4134-A2B2-9C0EADB2AEFB} = {8F57E7FF-1B73-4134-A2B2-9C0EADB2AEFB} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "can_peak_win32", "drivers\can_peak_win32\can_peak_win32.vcproj", "{732EC5B6-C6F1-4783-9BC8-924FFF67BF5A}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestMasterSlave", "examples\TestMasterSlave\TestMasterSlave.vcproj", "{B51A176D-5320-4534-913B-3025CED5B27E}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "can_ixxat_win32", "drivers\can_ixxat_win32\can_ixxat_win32.vc8.vcproj", "{8F57E7FF-1B73-4134-A2B2-9C0EADB2AEFB}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug UNICODE|Win32 = Debug UNICODE|Win32 Debug|Win32 = Debug|Win32 - Release UNICODE|Win32 = Release UNICODE|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {50EF2507-9B87-4525-8B19-80EB42E67079}.Debug UNICODE|Win32.ActiveCfg = Debug UNICODE|Win32 - {50EF2507-9B87-4525-8B19-80EB42E67079}.Debug UNICODE|Win32.Build.0 = Debug UNICODE|Win32 {50EF2507-9B87-4525-8B19-80EB42E67079}.Debug|Win32.ActiveCfg = Debug|Win32 {50EF2507-9B87-4525-8B19-80EB42E67079}.Debug|Win32.Build.0 = Debug|Win32 - {50EF2507-9B87-4525-8B19-80EB42E67079}.Release UNICODE|Win32.ActiveCfg = Release UNICODE|Win32 - {50EF2507-9B87-4525-8B19-80EB42E67079}.Release UNICODE|Win32.Build.0 = Release UNICODE|Win32 {50EF2507-9B87-4525-8B19-80EB42E67079}.Release|Win32.ActiveCfg = Release|Win32 {50EF2507-9B87-4525-8B19-80EB42E67079}.Release|Win32.Build.0 = Release|Win32 - {39E3300A-29B4-4AA7-AF62-3B181FC26155}.Debug UNICODE|Win32.ActiveCfg = Debug UNICODE|Win32 - {39E3300A-29B4-4AA7-AF62-3B181FC26155}.Debug UNICODE|Win32.Build.0 = Debug UNICODE|Win32 {39E3300A-29B4-4AA7-AF62-3B181FC26155}.Debug|Win32.ActiveCfg = Debug|Win32 {39E3300A-29B4-4AA7-AF62-3B181FC26155}.Debug|Win32.Build.0 = Debug|Win32 - {39E3300A-29B4-4AA7-AF62-3B181FC26155}.Release UNICODE|Win32.ActiveCfg = Release UNICODE|Win32 - {39E3300A-29B4-4AA7-AF62-3B181FC26155}.Release UNICODE|Win32.Build.0 = Release UNICODE|Win32 {39E3300A-29B4-4AA7-AF62-3B181FC26155}.Release|Win32.ActiveCfg = Release|Win32 {39E3300A-29B4-4AA7-AF62-3B181FC26155}.Release|Win32.Build.0 = Release|Win32 - {BD8B1FE1-89CD-4F89-8275-0F553FA71059}.Debug UNICODE|Win32.ActiveCfg = Debug|Win32 - {BD8B1FE1-89CD-4F89-8275-0F553FA71059}.Debug UNICODE|Win32.Build.0 = Debug|Win32 {BD8B1FE1-89CD-4F89-8275-0F553FA71059}.Debug|Win32.ActiveCfg = Debug|Win32 {BD8B1FE1-89CD-4F89-8275-0F553FA71059}.Debug|Win32.Build.0 = Debug|Win32 - {BD8B1FE1-89CD-4F89-8275-0F553FA71059}.Release UNICODE|Win32.ActiveCfg = Release|Win32 - {BD8B1FE1-89CD-4F89-8275-0F553FA71059}.Release UNICODE|Win32.Build.0 = Release|Win32 {BD8B1FE1-89CD-4F89-8275-0F553FA71059}.Release|Win32.ActiveCfg = Release|Win32 {BD8B1FE1-89CD-4F89-8275-0F553FA71059}.Release|Win32.Build.0 = Release|Win32 - {732EC5B6-C6F1-4783-9BC8-924FFF67BF5A}.Debug UNICODE|Win32.ActiveCfg = Debug UNICODE|Win32 - {732EC5B6-C6F1-4783-9BC8-924FFF67BF5A}.Debug UNICODE|Win32.Build.0 = Debug UNICODE|Win32 {732EC5B6-C6F1-4783-9BC8-924FFF67BF5A}.Debug|Win32.ActiveCfg = Debug|Win32 {732EC5B6-C6F1-4783-9BC8-924FFF67BF5A}.Debug|Win32.Build.0 = Debug|Win32 - {732EC5B6-C6F1-4783-9BC8-924FFF67BF5A}.Release UNICODE|Win32.ActiveCfg = Release UNICODE|Win32 - {732EC5B6-C6F1-4783-9BC8-924FFF67BF5A}.Release UNICODE|Win32.Build.0 = Release UNICODE|Win32 {732EC5B6-C6F1-4783-9BC8-924FFF67BF5A}.Release|Win32.ActiveCfg = Release|Win32 {732EC5B6-C6F1-4783-9BC8-924FFF67BF5A}.Release|Win32.Build.0 = Release|Win32 - {B51A176D-5320-4534-913B-3025CED5B27E}.Debug UNICODE|Win32.ActiveCfg = Debug|Win32 - {B51A176D-5320-4534-913B-3025CED5B27E}.Debug UNICODE|Win32.Build.0 = Debug|Win32 {B51A176D-5320-4534-913B-3025CED5B27E}.Debug|Win32.ActiveCfg = Debug|Win32 {B51A176D-5320-4534-913B-3025CED5B27E}.Debug|Win32.Build.0 = Debug|Win32 - {B51A176D-5320-4534-913B-3025CED5B27E}.Release UNICODE|Win32.ActiveCfg = Release|Win32 - {B51A176D-5320-4534-913B-3025CED5B27E}.Release UNICODE|Win32.Build.0 = Release|Win32 {B51A176D-5320-4534-913B-3025CED5B27E}.Release|Win32.ActiveCfg = Release|Win32 {B51A176D-5320-4534-913B-3025CED5B27E}.Release|Win32.Build.0 = Release|Win32 + {8F57E7FF-1B73-4134-A2B2-9C0EADB2AEFB}.Debug|Win32.ActiveCfg = Debug|Win32 + {8F57E7FF-1B73-4134-A2B2-9C0EADB2AEFB}.Debug|Win32.Build.0 = Debug|Win32 + {8F57E7FF-1B73-4134-A2B2-9C0EADB2AEFB}.Release|Win32.ActiveCfg = Release|Win32 + {8F57E7FF-1B73-4134-A2B2-9C0EADB2AEFB}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff -r cab66ef3e68e -r b0dd37421d28 CanFestival-3.vc8.vcproj --- a/CanFestival-3.vc8.vcproj Tue Aug 07 17:18:03 2007 +0200 +++ b/CanFestival-3.vc8.vcproj Wed Aug 08 01:43:02 2007 +0200 @@ -1,9 +1,10 @@ @@ -23,6 +24,9 @@ CharacterSet="2" > + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -316,6 +175,10 @@ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" > + + @@ -370,10 +233,6 @@ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" > - - @@ -382,38 +241,22 @@ > - - + + - - - - - - - - @@ -422,14 +265,6 @@ > - - - - @@ -494,13 +329,6 @@ Name="VCCustomBuildTool" /> - - - diff -r cab66ef3e68e -r b0dd37421d28 drivers/can_ixxat_win32/async_access_que.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/drivers/can_ixxat_win32/async_access_que.h Wed Aug 08 01:43:02 2007 +0200 @@ -0,0 +1,45 @@ +// thread safe que +// Tochinski Leonid, Chatten Associayes, Inc. +#pragma once +#include +#include "AutoReleaseCS.h" + +template +class async_access_que + { + public: + async_access_que() + { + ::InitializeCriticalSection(&m_cs); + } + ~async_access_que() + { + ::DeleteCriticalSection(&m_cs); + } + + void append(const type& data) + { + AutoReleaseCS acs(m_cs); + m_data.push_back(data); + } + + bool extract_top(type& data) + { + AutoReleaseCS acs(m_cs); + if (m_data.empty()) + return false; + data = m_data.front(); + m_data.pop_front(); + return true; + } + + void clear() + { + AutoReleaseCS acs(m_cs); + m_data.clear(); + } + + protected: + std::deque m_data; + CRITICAL_SECTION m_cs; + }; diff -r cab66ef3e68e -r b0dd37421d28 drivers/can_ixxat_win32/autoreleasecs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/drivers/can_ixxat_win32/autoreleasecs.h Wed Aug 08 01:43:02 2007 +0200 @@ -0,0 +1,17 @@ +// Critical Section Autorelease +// Tochinski Leonid, Chatten Associates, Inc. 2007 +#pragma once + +class AutoReleaseCS + { + public: + AutoReleaseCS(CRITICAL_SECTION& cs) : m_cs(cs) + { + ::EnterCriticalSection(&m_cs); + } + ~AutoReleaseCS() + { + ::LeaveCriticalSection(&m_cs); + } + CRITICAL_SECTION& m_cs; + }; diff -r cab66ef3e68e -r b0dd37421d28 drivers/can_ixxat_win32/can_ixxat_win32.vc8.vcproj --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/drivers/can_ixxat_win32/can_ixxat_win32.vc8.vcproj Wed Aug 08 01:43:02 2007 +0200 @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r cab66ef3e68e -r b0dd37421d28 drivers/can_ixxat_win32/ixxat.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/drivers/can_ixxat_win32/ixxat.cpp Wed Aug 08 01:43:02 2007 +0200 @@ -0,0 +1,292 @@ +// IXXAT adapter driver for CanFestival-3 Win32 port +// Copyright (C) 2007 Leonid Tochinski, ChattenAssociates, Inc. +// +// Notes +//-------------------------------------------- +// For building of this project you will need +// the following IXXAT API files +// Vci2.h +// Vci11un6.lib +// +// IXXAT Win32 drivers and API can be downloaded from +// http://www.ixxat.com/download_vci_en,7547,5873.html +// +// Copy Vci2.h & Vci11un6.lib files to can_ixxat_win32 folder of add path to them in Project settings. + +#include +extern "C" { +#include "applicfg.h" +#include "can_driver.h" +#include "def.h" +} +#include "VCI2.h" +#include "async_access_que.h" + +#pragma warning(disable:4996) + +#define CAN_NUM 0 + +class IXXAT + { + public: + class error + { + }; + IXXAT(s_BOARD *board); + ~IXXAT(); + bool send(const Message *m); + bool receive(Message *m); + private: + bool open(const char* board_name, int board_number, const char* baud_rate); + bool close(); + void receive_queuedata(UINT16 que_hdl, UINT16 count, VCI_CAN_OBJ* p_obj); + // VCI2 handler + static void VCI_CALLBACKATTR message_handler(char *msg_str); + static void VCI_CALLBACKATTR receive_queuedata_handler(UINT16 que_hdl, UINT16 count, VCI_CAN_OBJ* p_obj); + static void VCI_CALLBACKATTR exception_handler(VCI_FUNC_NUM func_num, INT32 err_code, UINT16 ext_err, char* err_str); + + private: + UINT16 m_BoardHdl; + UINT16 m_TxQueHdl; + UINT16 m_RxQueHdl; + async_access_que m_RX_Que; + static IXXAT* m_callbackPtr; + }; + +IXXAT *IXXAT::m_callbackPtr = NULL; + +IXXAT::IXXAT(s_BOARD *board) : m_BoardHdl(0xFFFF), + m_TxQueHdl(0xFFFF), + m_RxQueHdl(0xFFFF) + + { + char busname[100]; + ::strcpy(busname,board->busname); + char board_name[100]; + long board_number = 0; + char *ptr = ::strrchr(busname,':'); + if (ptr != 0) + { + *ptr = 0; + ::strcpy(board_name,busname); + if (++ptr - busname < (int)::strlen(board->busname)) + board_number = ::atoi(ptr); + } + if (!open(board_name,board_number,board->baudrate)) + { + close(); + throw error(); + } + m_callbackPtr = this; + } + +IXXAT::~IXXAT() + { + close(); + m_callbackPtr = 0; + } + +bool IXXAT::send(const Message *m) + { + if (m_BoardHdl == 0xFFFF) + return false; + long res = VCI_ERR; + if (m->rtr == NOT_A_REQUEST) + res = VCI_TransmitObj(m_BoardHdl, m_TxQueHdl, m->cob_id.w, m->len, const_cast(m->data)); + else + res = VCI_RequestObj(m_BoardHdl, m_TxQueHdl, m->cob_id.w, m->len); + return (res == VCI_OK); + } + + +bool IXXAT::receive(Message *m) + { + if (m_BoardHdl == 0xFFFF) + return false; + VCI_CAN_OBJ obj; + if (m_RX_Que.extract_top(obj)) + { + m->cob_id.w = obj.id; + m->len = obj.len; + m->rtr = (obj.rtr == VCI_RX_BUF) ? NOT_A_REQUEST : REQUEST; + if (m->rtr == NOT_A_REQUEST) + ::memcpy(m->data, obj.a_data, m->len); + return true; + } + return false; + } + +bool IXXAT::open(const char* board_name, int board_number, const char* baud_rate) + { + // check, if baudrate is supported + struct IXXAT_baud_rate_param + { + UINT8 bt0; + UINT8 bt1; + }; + struct IXXAT_look_up_table + { + char baud_rate[20]; + IXXAT_baud_rate_param bt; + }; + static const IXXAT_look_up_table br_lut[] = { + {"10K",{VCI_10KB}}, + {"20K",{VCI_20KB}}, + {"50K",{VCI_50KB}}, + {"100K",{VCI_100KB}}, + {"125K",{VCI_125KB}}, + {"250K",{VCI_250KB}}, + {"500K",{VCI_500KB}}, + {"800K",{VCI_800KB}}, + {"1M",{VCI_1000KB}} + }; + static const long br_lut_size = sizeof (br_lut)/sizeof(IXXAT_look_up_table); + int index; + for (index = 0; index < br_lut_size; ++index) + { + if (::strcmp(br_lut[index].baud_rate,baud_rate)==0) + break; + } + if (index == br_lut_size) + return false; + // close existing board + close(); + // init IXXAT board + unsigned long board_type = VCI_GetBrdTypeByName(const_cast(board_name)); + long res = VCI2_PrepareBoard( board_type, // board type + board_number, // unique board index + NULL, // pointer to buffer for additional info + 0, // length of additional info buffer + message_handler, // pointer to msg-callbackhandler + receive_queuedata_handler, // pointer to receive-callbackhandler + exception_handler); // pointer to exception-callbackhandler + if (res < 0) + return false; + m_BoardHdl = (UINT16)res; + + VCI_ResetBoard(m_BoardHdl); + + // init CAN parameters + + // initialize CAN-Controller + res = VCI_InitCan(m_BoardHdl, CAN_NUM, br_lut[index].bt.bt0,br_lut[index].bt.bt1, VCI_11B); + + // definition of Acceptance-Mask (define to receive all IDs) + res = VCI_SetAccMask(m_BoardHdl, CAN_NUM, 0x0UL, 0x0UL); + + // definition of Transmit Queue + res = VCI_ConfigQueue(m_BoardHdl, CAN_NUM, VCI_TX_QUE, 100 , 0, 0, 0, &m_TxQueHdl); + + // definition of Receive Queue (interrupt mode) + res = VCI_ConfigQueue(m_BoardHdl, CAN_NUM, VCI_RX_QUE, 50, 1, 0, 100, &m_RxQueHdl); + + // assign the all IDs to the Receive Queue + res = VCI_AssignRxQueObj(m_BoardHdl, m_RxQueHdl ,VCI_ACCEPT, 0, 0) ; + + // And now start the CAN + res = VCI_StartCan(m_BoardHdl, CAN_NUM); + + return true; + } + +bool IXXAT::close() + { + if (m_BoardHdl == 0xFFFF) + return true; + VCI_ResetBoard(m_BoardHdl); + VCI_CancelBoard(m_BoardHdl); + m_BoardHdl = + m_TxQueHdl = + m_RxQueHdl = 0xFFFF; + return true; + } + +void IXXAT::receive_queuedata(UINT16 que_hdl, UINT16 count, VCI_CAN_OBJ *p_obj) + { + for (int i = 0; i < count; ++i) + m_RX_Que.append(p_obj[i]); // can packet + } + +void VCI_CALLBACKATTR IXXAT::receive_queuedata_handler(UINT16 que_hdl, UINT16 count, VCI_CAN_OBJ *p_obj) + { + if (m_callbackPtr != NULL) + m_callbackPtr->receive_queuedata(que_hdl, count, p_obj); + } + +void VCI_CALLBACKATTR IXXAT::message_handler(char *msg_str) + { + char buf[200]; + ::sprintf(buf,"IXXAT Message: [%s]\n", msg_str); + ::OutputDebugString(buf); + } + +void VCI_CALLBACKATTR IXXAT::exception_handler(VCI_FUNC_NUM func_num, INT32 err_code, UINT16 ext_err, char* err_str) + { + static const char* Num2Function[] = + { + "VCI_Init", + "VCI_Searchboard", + "VCI_Prepareboard", + "VCI_Cancel_board", + "VCI_Testboard", + "VCI_ReadBoardInfo", + "VCI_ReadBoardStatus", + "VCI_Resetboard", + "VCI_ReadCANInfo", + "VCI_ReadCANStatus", + "VCI_InitCAN", + "VCI_SetAccMask", + "VCI_ResetCAN", + "VCI_StartCAN", + "VCI_ResetTimeStamps", + "VCI_ConfigQueue", + "VCI_AssignRxQueObj", + "VCI_ConfigBuffer", + "VCI_ReconfigBuffer", + "VCI_ConfigTimer", + "VCI_ReadQueStatus", + "VCI_ReadQueObj", + "VCI_ReadBufStatus", + "VCI_ReadBufData", + "VCI_TransmitObj", + "VCI_RequestObj", + "VCI_UpdateBufObj", + "VCI_CciReqData" + }; + char buf[200]; + ::sprintf(buf, "IXXAT Exception: %s (%i / %u) [%s]\n", Num2Function[func_num], err_code, ext_err, err_str); + ::OutputDebugString(buf); + } + +//------------------------------------------------------------------------ +extern "C" + UNS8 canReceive_driver(CAN_HANDLE inst, Message *m) + { + return (UNS8)reinterpret_cast(inst)->receive(m); + } + +extern "C" + UNS8 canSend_driver(CAN_HANDLE inst, Message *m) + { + return (UNS8)reinterpret_cast(inst)->send(m); + } + +extern "C" + CAN_HANDLE canOpen_driver(s_BOARD *board) + { + try + { + return new IXXAT(board); + } + catch (IXXAT::error&) + { + return 0; + } + } + +extern "C" + int canClose_driver(CAN_HANDLE inst) + { + delete reinterpret_cast(inst); + return 1; + } diff -r cab66ef3e68e -r b0dd37421d28 drivers/can_ixxat_win32/ixxat.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/drivers/can_ixxat_win32/ixxat.def Wed Aug 08 01:43:02 2007 +0200 @@ -0,0 +1,7 @@ +LIBRARY IXXAT + +EXPORTS + canReceive_driver + canSend_driver + canOpen_driver + canClose_driver diff -r cab66ef3e68e -r b0dd37421d28 src/pdo.c --- a/src/pdo.c Tue Aug 07 17:18:03 2007 +0200 +++ b/src/pdo.c Wed Aug 08 01:43:02 2007 +0200 @@ -120,9 +120,10 @@ pwCobId = (UNS32*) d->objdict[offset].pSubindex[1].pObject; MSG_WAR(0x3930, "sendPDOrequest cobId is : ",*pwCobId); - + { Message pdo = {*pwCobId, REQUEST, 0}; return canSend(d->canHandle,&pdo); + } } } MSG_ERR(0x1931, "sendPDOrequest : RPDO Index not found : ", RPDOIndex); @@ -475,7 +476,10 @@ /*Reset count of SYNC*/ d->PDO_status[pdoNum].transmit_type_parameter = 0; MSG_WAR(0x3964, " PDO is on SYNCHRO. Trans type : ", *pTransmissionType); - pdo = (Message)Message_Initializer; + { + Message msg_init = Message_Initializer; + pdo = msg_init; + } if(buildPDO(d, pdoNum, &pdo)) { MSG_ERR(0x1906, " Couldn't build TPDO number : ", pdoNum); @@ -500,7 +504,10 @@ *pTransmissionType == TRANS_EVENT_SPECIFIC )&& !(d->PDO_status[pdoNum].transmit_type_parameter & PDO_INHIBITED)) { MSG_WAR(0x3968, " PDO is on EVENT. Trans type : ", *pTransmissionType); - pdo = (Message)Message_Initializer; + { + Message msg_init = Message_Initializer; + pdo = msg_init; + } if(buildPDO(d, pdoNum, &pdo)) { MSG_ERR(0x3907, " Couldn't build TPDO number : ", pdoNum); diff -r cab66ef3e68e -r b0dd37421d28 src/sync.c --- a/src/sync.c Tue Aug 07 17:18:03 2007 +0200 +++ b/src/sync.c Wed Aug 08 01:43:02 2007 +0200 @@ -1,165 +1,171 @@ -/* -This file is part of CanFestival, a library implementing CanOpen Stack. - -Copyright (C): Edouard TISSERANT and Francis DUPIN - -See COPYING file for copyrights details. - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -/*! -** @file sync.c -** @author Edouard TISSERANT and Francis DUPIN -** @date Tue Jun 5 09:32:32 2007 -** -** @brief -** -** -*/ - -#include "data.h" -#include "sync.h" -#include "canfestival.h" - -/* Prototypes for internals functions */ - -/*! -** -** -** @param d -** @param id -**/ -void SyncAlarm(CO_Data* d, UNS32 id); -UNS32 OnCOB_ID_SyncUpdate(CO_Data* d, const indextable * unsused_indextable, - UNS8 unsused_bSubindex); - -/*! -** -** -** @param d -** @param id -**/ -void SyncAlarm(CO_Data* d, UNS32 id) -{ - sendSYNC(d, *d->COB_ID_Sync & 0x1FFFFFFF) ; -} - -/*! -** This is called when Index 0x1005 is updated. -** -** @param d -** @param unsused_indextable -** @param unsused_bSubindex -** -** @return -**/ -UNS32 OnCOB_ID_SyncUpdate(CO_Data* d, const indextable * unsused_indextable, UNS8 unsused_bSubindex) -{ - startSYNC(d); - return 0; -} - -/*! -** -** -** @param d -**/ -void startSYNC(CO_Data* d) -{ - RegisterSetODentryCallBack(d, 0x1005, 0, &OnCOB_ID_SyncUpdate); - RegisterSetODentryCallBack(d, 0x1006, 0, &OnCOB_ID_SyncUpdate); - - if(d->syncTimer != TIMER_NONE){ - stopSYNC(d); - } - - if(*d->COB_ID_Sync & 0x40000000 && *d->Sync_Cycle_Period) - { - d->syncTimer = SetAlarm( - d, - 0 /*No id needed*/, - &SyncAlarm, - US_TO_TIMEVAL(*d->Sync_Cycle_Period), - US_TO_TIMEVAL(*d->Sync_Cycle_Period)); - } -} - -/*! -** -** -** @param d -**/ -void stopSYNC(CO_Data* d) -{ - d->syncTimer = DelAlarm(d->syncTimer); -} - -/*! -** -** -** @param d -** @param cob_id -** -** @return -**/ -UNS8 sendSYNC(CO_Data* d, UNS32 cob_id) -{ - Message m; - UNS8 resultat ; - - MSG_WAR(0x3001, "sendSYNC ", 0); - - m.cob_id.w = cob_id ; - m.rtr = NOT_A_REQUEST; - m.len = 0; - resultat = canSend(d->canHandle,&m) ; - proceedSYNC(d, &m) ; - return resultat ; -} - -/*! -** -** -** @param d -** @param m -** -** @return -**/ -UNS8 proceedSYNC(CO_Data* d, Message *m) -{ - - UNS8 res; - - MSG_WAR(0x3002, "SYNC received. Proceed. ", 0); - - (*d->post_sync)(); - - /* only operational state allows PDO transmission */ - if(! d->CurrentCommunicationState.csPDO) - return 0; - - res = _sendPDOevent(d, 1 /*isSyncEvent*/ ); - - /*Call user app callback*/ - (*d->post_TPDO)(); - - return res; - -} - - -void _post_sync(){} -void _post_TPDO(){} +/* +This file is part of CanFestival, a library implementing CanOpen Stack. + + +Copyright (C): Edouard TISSERANT and Francis DUPIN + + +See COPYING file for copyrights details. + + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +/*! +** @file sync.c +** @author Edouard TISSERANT and Francis DUPIN +** @date Tue Jun 5 09:32:32 2007 +** +** @brief +** +** +*/ + +#include "data.h" +#include "sync.h" +#include "canfestival.h" + +/* Prototypes for internals functions */ + +/*! +** +** +** @param d +** @param id +**/ +void SyncAlarm(CO_Data* d, UNS32 id); +UNS32 OnCOB_ID_SyncUpdate(CO_Data* d, const indextable * unsused_indextable, + UNS8 unsused_bSubindex); + +/*! +** +** +** @param d +** @param id +**/ +void SyncAlarm(CO_Data* d, UNS32 id) +{ + sendSYNC(d, *d->COB_ID_Sync & 0x1FFFFFFF) ; +} + +/*! +** This is called when Index 0x1005 is updated. +** +** @param d +** @param unsused_indextable +** @param unsused_bSubindex +** +** @return +**/ +UNS32 OnCOB_ID_SyncUpdate(CO_Data* d, const indextable * unsused_indextable, UNS8 unsused_bSubindex) +{ + startSYNC(d); + return 0; +} + +/*! +** +** +** @param d +**/ +void startSYNC(CO_Data* d) +{ + RegisterSetODentryCallBack(d, 0x1005, 0, &OnCOB_ID_SyncUpdate); + RegisterSetODentryCallBack(d, 0x1006, 0, &OnCOB_ID_SyncUpdate); + + if(d->syncTimer != TIMER_NONE){ + stopSYNC(d); + } + + if(*d->COB_ID_Sync & 0x40000000 && *d->Sync_Cycle_Period) + { + d->syncTimer = SetAlarm( + d, + 0 /*No id needed*/, + &SyncAlarm, + US_TO_TIMEVAL(*d->Sync_Cycle_Period), + US_TO_TIMEVAL(*d->Sync_Cycle_Period)); + } +} + +/*! +** +** +** @param d +**/ +void stopSYNC(CO_Data* d) +{ + d->syncTimer = DelAlarm(d->syncTimer); +} + +/*! +** +** +** @param d +** @param cob_id +** +** @return +**/ +UNS8 sendSYNC(CO_Data* d, UNS32 cob_id) +{ + Message m; + UNS8 resultat ; + + MSG_WAR(0x3001, "sendSYNC ", 0); + + m.cob_id.w = cob_id ; + m.rtr = NOT_A_REQUEST; + m.len = 0; + resultat = canSend(d->canHandle,&m) ; + proceedSYNC(d, &m) ; + return resultat ; +} + +/*! +** +** +** @param d +** @param m +** +** @return +**/ +UNS8 proceedSYNC(CO_Data* d, Message *m) +{ + + UNS8 res; + + MSG_WAR(0x3002, "SYNC received. Proceed. ", 0); + + (*d->post_sync)(); + + /* only operational state allows PDO transmission */ + if(! d->CurrentCommunicationState.csPDO) + return 0; + + res = _sendPDOevent(d, 1 /*isSyncEvent*/ ); + + /*Call user app callback*/ + (*d->post_TPDO)(); + + return res; + +} + + +void _post_sync(){} +void _post_TPDO(){} diff -r cab66ef3e68e -r b0dd37421d28 src/win32/CanFestival-3.def --- a/src/win32/CanFestival-3.def Tue Aug 07 17:18:03 2007 +0200 +++ b/src/win32/CanFestival-3.def Wed Aug 08 01:43:02 2007 +0200 @@ -1,17 +1,30 @@ -; CanFestival-3.def : Declares the module parameters. +; CanFestival-3.def : Declares DLL exports. LIBRARY "CanFestival-3.DLL" EXPORTS + + ; dsf.h + decompo_dcf + + ; lifegrd.h + _heartbeatError getNodeState heartbeatInit heartbeatStop proceedNODE_GUARD + + ; nmtMaster.h masterSendNMTstateChange masterSendNMTnodeguard masterRequestNodeState + + ; nmtSlave.h proceedNMTstateChange slaveSendBootUp + + ; objacces.h + _storeODSubIndex accessDictionaryError getODentry setODentry @@ -19,18 +32,27 @@ readLocalDict scanIndexOD RegisterSetODentryCallBack - sendPDO - PDOmGR -; buildPDO + + ; pdo.h + buildPDO sendPDOrequest proceedPDO -; sendPDOevent + sendPDOevent + _sendPDOevent + PDOInit + PDOStop + PDOEventTimerAlarm + PDOInhibitTimerAlarm + CopyBits + + ; sdo.h + SDOTimeoutAlarm + resetSDO SDOlineToObjdict objdictToSDOline lineToSDO SDOtoLine failedSDO - resetSDO resetSDOline initSDOline getSDOfreeLine @@ -42,38 +64,47 @@ sendSDOabort proceedSDO writeNetworkDict + writeNetworkDictCallBack readNetworkDict readNetworkDictCallback getReadResultNetworkDict getWriteResultNetworkDict + + ; states.h + _operational + _preOperational + _initialisation + _stopped canDispatch getState setState getNodeId setNodeId -; initPreOperationalMode + ;initPreOperationalMode + + ; sync.h + startSYNC + stopSYNC + _post_sync + _post_TPDO sendSYNC proceedSYNC + + + ; timer.h SetAlarm DelAlarm TimeDispatch setTimer getElapsedTime + + ; timers_driver.h StartTimerLoop StopTimerLoop CreateReceiveTask - LoadCanDriver - canSend - canReceive - canOpen - canClose - _post_TPDO - _post_sync - _heartbeatError - _stopped - _operational - _preOperational - _initialisation - writeNetworkDictCallBack - _storeODSubIndex - decompo_dcf + + ; win32/canfestival.h + LoadCanDriver + canSend + canOpen + canClose