include/data.h
author etisserant
Mon, 19 Jun 2006 14:19:23 +0200
changeset 33 c767eabbaaac
parent 32 8afa33692372
child 71 95cd3376cc9f
permissions -rw-r--r--
Fixed some bugs with Xenomai and CAN/peak
/*
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
*/


#ifndef __data_h__
#define __data_h__

// declaration of CO_Data type let us include all necessary headers
// struct struct_CO_Data can then be defined later
typedef struct struct_CO_Data CO_Data;

#include <applicfg.h>
#include "def.h"
#include "can.h"
#include "objdictdef.h"
#include "objacces.h"
#include "sdo.h"
#include "pdo.h"
#include "states.h"
#include "lifegrd.h"
#include "sync.h"
#include "nmtMaster.h"

// This structurs contains all necessary information for a CanOpen node
struct struct_CO_Data {
	// Object dictionary
	UNS8 *bDeviceNodeId;
	const indextable *objdict;
	UNS8 *count_sync;
	quick_index *firstIndex;
	quick_index *lastIndex;
	UNS16 *ObjdictSize;
	const UNS8 *iam_a_slave;
	valueRangeTest_t valueRangeTest;
	
	// SDO
	s_transfer transfers[SDO_MAX_SIMULTANEOUS_TRANSFERTS];
	SDOtimeoutError_t SDOtimeoutError;
	//s_sdo_parameter *sdo_parameters;

	// State machine
	e_nodeState nodeState;
	s_state_communication CurrentCommunicationState;
	initialisation_t initialisation;
	preOperational_t preOperational;
	operational_t operational;
	stopped_t stopped;

	// NMT-heartbeat
	UNS8 *ConsumerHeartbeatCount;
	UNS32 *ConsumerHeartbeatEntries;
	TIMER_HANDLE *ConsumerHeartBeatTimers;
	UNS16 *ProducerHeartBeatTime;
	TIMER_HANDLE ProducerHeartBeatTimer;
	heartbeatError_t heartbeatError;
	e_nodeState NMTable[NMT_MAX_NODE_ID]; 

	// SYNC
	TIMER_HANDLE syncTimer;
	UNS32 *COB_ID_Sync;
	UNS32 *Sync_Cycle_Period;
	/*UNS32 *Sync_window_length*/;
	post_sync_t post_sync;
	post_TPDO_t post_TPDO;
	
	// PDO
	s_process_var process_var;
	
	// General
	UNS8 toggle;
	canSend_t canSend;	
	scanIndexOD_t scanIndexOD;
};

// A macro to initialize the data in client app.
#define CANOPEN_NODE_DATA_INITIALIZER(NODE_PREFIX) {\
	/* Object dictionary*/\
	bDeviceNodeId:& NODE_PREFIX ## _bDeviceNodeId,\
	objdict: NODE_PREFIX ## _objdict,\
	count_sync: NODE_PREFIX ## _count_sync,\
	firstIndex: & NODE_PREFIX ## _firstIndex,\
	lastIndex: & NODE_PREFIX ## _lastIndex,\
	ObjdictSize: & NODE_PREFIX ## _ObjdictSize,\
	iam_a_slave: & NODE_PREFIX ## _iam_a_slave,\
	valueRangeTest: NODE_PREFIX ## _valueRangeTest,\
	\
	/* SDO */\
	transfers:{{\
		nodeId: 0,\
		index: 0,\
		subIndex: 0,\
		state: SDO_RESET,\
		toggle: 0,\
		count: 0,\
		offset: 0,\
		data: {0,},\
		dataType: 0,\
		timer: -1,\
		Callback: NULL},},\
	SDOtimeoutError: &NODE_PREFIX ## _SDOtimeoutError,\
	\
	/* State machine */\
	nodeState:Unknown_state,\
	CurrentCommunicationState:{\
		csBoot_Up: 0,\
		csSDO: 0,\
		csEmergency: 0,\
		csSYNC: 0,\
		csHeartbeat: 0,\
		csPDO: 0},\
	initialisation: &NODE_PREFIX ## _initialisation,\
	preOperational: &NODE_PREFIX ## _preOperational,\
	operational: &NODE_PREFIX ## _operational,\
	stopped: &NODE_PREFIX ## _stopped,\
	\
	/* NMT-heartbeat */\
	ConsumerHeartbeatCount: & NODE_PREFIX ## _highestSubIndex_obj1016,\
	ConsumerHeartbeatEntries: NODE_PREFIX ## _obj1016,\
	ConsumerHeartBeatTimers: NODE_PREFIX ## _heartBeatTimers,\
	ProducerHeartBeatTime: & NODE_PREFIX ## _obj1017,\
	ProducerHeartBeatTimer: TIMER_NONE,\
	heartbeatError: NODE_PREFIX ## _heartbeatError,\
	NMTable:{Unknown_state,},\
	\
	/* SYNC */\
	syncTimer: TIMER_NONE,\
	COB_ID_Sync: & NODE_PREFIX ## _obj1005,\
	Sync_Cycle_Period: & NODE_PREFIX ## _obj1006,\
	/*Sync_window_length: & NODE_PREFIX ## _obj1007,*/\
	post_sync: NODE_PREFIX ## _post_sync,\
	post_TPDO: NODE_PREFIX ## _post_TPDO,\
	\
	/* PDO */\
	process_var: {\
		count: 0,\
		data: {0,}},\
	\
	/* General */\
	toggle: 0,\
	canSend: NODE_PREFIX ## _canSend,\
	scanIndexOD: NODE_PREFIX ## _scanIndexOD\
}

#endif // __data_h__