examples/CANOpenShell/CANOpenShell.c
author greg
Wed, 15 Jul 2009 09:32:35 +0200
changeset 555 ee24dcbd3e64
child 559 8543e7edae4a
permissions -rwxr-xr-x
Add new example : CANOpen shell
555
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
     1
/*
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
     2
This file is part of CanFestival, a library implementing CanOpen Stack.
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
     3
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
     4
Copyright (C): Edouard TISSERANT and Francis DUPIN
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
     5
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
     6
See COPYING file for copyrights details.
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
     7
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
     8
This library is free software; you can redistribute it and/or
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
     9
modify it under the terms of the GNU Lesser General Public
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    10
License as published by the Free Software Foundation; either
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    11
version 2.1 of the License, or (at your option) any later version.
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    12
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    13
This library is distributed in the hope that it will be useful,
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    14
but WITHOUT ANY WARRANTY; without even the implied warranty of
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    15
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    16
Lesser General Public License for more details.
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    17
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    18
You should have received a copy of the GNU Lesser General Public
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    19
License along with this library; if not, write to the Free Software
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    20
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    21
*/
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    22
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    23
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    24
#if defined(WIN32) && !defined(__CYGWIN__)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    25
	#include <windows.h>
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    26
	#define CLEARSCREEN "cls"
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    27
	#define SLEEP(time) Sleep(time * 1000)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    28
#else
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    29
	#include <unistd.h>
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    30
	#include <stdio.h>
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    31
	#include <string.h>
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    32
	#include <stdlib.h>
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    33
	#include <signal.h>
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    34
	#define CLEARSCREEN "clear"
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    35
	#define SLEEP(time) sleep(time)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    36
#endif
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    37
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    38
//****************************************************************************
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    39
// INCLUDES
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    40
#include "canfestival.h"
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    41
#include "CANOpenShell.h"
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    42
#include "CANOpenShellMasterOD.h"
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    43
#include "CANOpenShellSlaveOD.h"
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    44
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    45
//****************************************************************************
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    46
// DEFINES
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    47
#define MAX_NODES 127
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    48
#define cst_str4(c1, c2, c3, c4) ((((unsigned int)0 | \
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    49
                                    (char)c4 << 8) | \
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    50
                                   (char)c3) << 8 | \
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    51
                                  (char)c2) << 8 | \
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    52
                                 (char)c1
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    53
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    54
#define INIT_ERR 2
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    55
#define QUIT 1
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    56
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    57
//****************************************************************************
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    58
// GLOBALS
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    59
char BoardBusName[11];
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    60
char BoardBaudRate[5];
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    61
s_BOARD Board = {BoardBusName, BoardBaudRate};
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    62
CO_Data* CANOpenShellOD_Data;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    63
int init_step = 0;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    64
char LibraryPath[512];
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    65
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    66
/*****************************************************************************/
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    67
#if !defined(WIN32) || defined(__CYGWIN__)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    68
void catch_signal(int sig)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    69
{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    70
	signal(SIGTERM, catch_signal);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    71
	signal(SIGINT, catch_signal);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    72
	printf("Got Signal %d\n",sig);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    73
}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    74
#endif
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    75
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    76
/* Sleep for n seconds */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    77
void SleepFunction(int second)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    78
{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    79
	SLEEP(second);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    80
}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    81
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    82
/* Ask a slave node to go in operational mode */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    83
void StartNode(CO_Data* d, UNS8 nodeid)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    84
{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    85
	EnterMutex();
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    86
	masterSendNMTstateChange(d, nodeid, NMT_Start_Node);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    87
	LeaveMutex();
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    88
}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    89
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    90
/* Ask a slave node to go in pre-operational mode */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    91
void StopNode(CO_Data* d, UNS8 nodeid)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    92
{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    93
	EnterMutex();
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    94
	masterSendNMTstateChange(d, nodeid, NMT_Stop_Node);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    95
	LeaveMutex();
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    96
}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    97
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    98
/* Ask a slave node to reset */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
    99
void ResetNode(CO_Data* d, UNS8 nodeid)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   100
{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   101
	EnterMutex();
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   102
	masterSendNMTstateChange(d, nodeid, NMT_Reset_Node);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   103
	LeaveMutex();
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   104
}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   105
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   106
/* Reset all nodes on the network and print message when boot-up*/
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   107
void DiscoverNodes(CO_Data* d)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   108
{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   109
	printf("Wait for Slave nodes bootup...\n\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   110
	ResetNode(CANOpenShellOD_Data, 0x0);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   111
}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   112
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   113
/* Callback function that check the read SDO demand */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   114
void CheckReadInfoSDO(CO_Data* d, UNS8 nodeid)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   115
{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   116
	UNS32 abortCode;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   117
	UNS32 data;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   118
	UNS32 size=64;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   119
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   120
	if(getReadResultNetworkDict(d, nodeid, &data, &size, &abortCode) != SDO_FINISHED)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   121
		printf("Master : Failed in getting information for slave %2.2x, AbortCode :%4.4x \n", nodeid, abortCode);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   122
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   123
	/* Finalise last SDO transfer with this node */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   124
	closeSDOtransfer(CANOpenShellOD_Data, nodeid, SDO_CLIENT);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   125
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   126
	/* Display data received */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   127
	switch(init_step)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   128
	{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   129
		case 1:
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   130
				printf("Device type     : %x\n", data);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   131
				break;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   132
		case 2:
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   133
				printf("Vendor ID       : %x\n", data);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   134
				break;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   135
		case 3:
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   136
				printf("Product Code    : %x\n", data);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   137
				break;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   138
		case 4:
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   139
				printf("Revision Number : %x\n", data);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   140
				break;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   141
	}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   142
	GetSlaveNodeInfo(d, nodeid);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   143
}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   144
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   145
/* Retrieve node informations located at index 0x1000 (Device Type) and 0x1018 (Identity) */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   146
void GetSlaveNodeInfo(CO_Data* d, UNS8 nodeid)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   147
{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   148
		switch(++init_step)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   149
		{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   150
			case 1: /* Get device type */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   151
				printf("##################################\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   152
				printf("#### Informations for node %x ####\n", nodeid);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   153
				printf("##################################\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   154
				readNetworkDictCallback(d, nodeid, 0x1000, 0x00, 0, CheckReadInfoSDO);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   155
				break;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   156
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   157
			case 2: /* Get Vendor ID */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   158
				readNetworkDictCallback(d, nodeid, 0x1018, 0x01, 0, CheckReadInfoSDO);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   159
				break;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   160
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   161
			case 3: /* Get Product Code */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   162
				readNetworkDictCallback(d, nodeid, 0x1018, 0x02, 0, CheckReadInfoSDO);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   163
				break;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   164
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   165
			case 4: /* Get Revision Number */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   166
				readNetworkDictCallback(d, nodeid, 0x1018, 0x03, 0, CheckReadInfoSDO);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   167
				break;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   168
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   169
			case 5: /* Print node info */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   170
				init_step = 0;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   171
		}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   172
}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   173
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   174
/* Callback function that check the read SDO demand */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   175
void CheckReadSDO(CO_Data* d, UNS8 nodeid)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   176
{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   177
	UNS32 abortCode;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   178
	UNS32 data;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   179
	UNS32 size=64;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   180
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   181
	if(getReadResultNetworkDict(d, nodeid, &data, &size, &abortCode) != SDO_FINISHED)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   182
		printf("\nResult : Failed in getting information for slave %2.2x, AbortCode :%4.4x \n", nodeid, abortCode);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   183
	else
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   184
		printf("\nResult : = %x\n", data);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   185
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   186
	/* Finalise last SDO transfer with this node */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   187
	closeSDOtransfer(CANOpenShellOD_Data, nodeid, SDO_CLIENT);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   188
}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   189
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   190
/* Read a slave node object dictionary entry */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   191
void ReadDeviceEntry(CO_Data* d, char* sdo)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   192
{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   193
	int nodeid;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   194
	int index;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   195
	int subindex;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   196
	int size;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   197
	int datatype = 0;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   198
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   199
	sscanf(sdo, "%2x%4x%2x", &nodeid, &index, &subindex);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   200
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   201
	printf("##################################\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   202
	printf("#### Read SDO                 ####\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   203
	printf("##################################\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   204
	printf("NodeId   : %2.2x\n", nodeid);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   205
	printf("Index    : %4.4x\n", index);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   206
	printf("SubIndex : %2.2x\n", subindex);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   207
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   208
	readNetworkDictCallback(d, (UNS8)nodeid, (UNS16)index, (UNS8)subindex, (UNS8)datatype, CheckReadSDO);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   209
}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   210
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   211
/* Callback function that check the write SDO demand */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   212
void CheckWriteSDO(CO_Data* d, UNS8 nodeid)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   213
{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   214
	UNS32 abortCode;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   215
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   216
	if(getWriteResultNetworkDict(d, nodeid, &abortCode) != SDO_FINISHED)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   217
		printf("\nResult : Failed in getting information for slave %2.2x, AbortCode :%4.4x \n", nodeid, abortCode);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   218
	else
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   219
		printf("\nSend data OK\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   220
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   221
	/* Finalise last SDO transfer with this node */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   222
	closeSDOtransfer(CANOpenShellOD_Data, nodeid, SDO_CLIENT);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   223
}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   224
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   225
/* Write a slave node object dictionnary entry */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   226
void WriteDeviceEntry(CO_Data* d, char* sdo)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   227
{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   228
	int nodeid;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   229
	int index;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   230
	int subindex;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   231
	int size;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   232
	int data;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   233
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   234
	sscanf(sdo, "%2x%4x%2x%2x%4x", &nodeid , &index, &subindex, &size, &data);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   235
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   236
	printf("##################################\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   237
	printf("#### Write SDO                ####\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   238
	printf("##################################\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   239
	printf("NodeId   : %2.2x\n", nodeid);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   240
	printf("Index    : %4.4x\n", index);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   241
	printf("SubIndex : %2.2x\n", subindex);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   242
	printf("Size     : %2.2x\n", size);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   243
	printf("Data     : %x\n", data);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   244
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   245
	writeNetworkDictCallBackAI(d, nodeid, index, subindex, size, 0, &data, CheckWriteSDO, 1);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   246
}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   247
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   248
void CANOpenShellOD_post_SlaveBootup(CO_Data* d, UNS8 nodeid)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   249
{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   250
	printf("Slave %x boot up\n", nodeid);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   251
}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   252
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   253
/***************************  CALLBACK FUNCTIONS  *****************************************/
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   254
void CANOpenShellOD_initialisation(CO_Data* d)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   255
{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   256
	//printf("Master_initialisation\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   257
}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   258
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   259
void CANOpenShellOD_preOperational(CO_Data* d)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   260
{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   261
	//printf("Master_preOperational\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   262
}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   263
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   264
void CANOpenShellOD_operational(CO_Data* d)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   265
{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   266
	//printf("Master_operational\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   267
}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   268
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   269
void CANOpenShellOD_stopped(CO_Data* d)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   270
{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   271
	//printf("Master_stopped\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   272
}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   273
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   274
void CANOpenShellOD_post_sync(CO_Data* d)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   275
{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   276
	//printf("Master_post_sync\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   277
}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   278
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   279
void CANOpenShellOD_post_TPDO(CO_Data* d)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   280
{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   281
	//printf("Master_post_TPDO\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   282
}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   283
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   284
/***************************  MASTER INITIALISATION **********************************/
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   285
void Init(CO_Data* d, UNS32 nodeid)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   286
{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   287
	if(Board.baudrate)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   288
	{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   289
		/* Defining the node Id */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   290
		setNodeId(CANOpenShellOD_Data, nodeid);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   291
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   292
		/* Init */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   293
		setState(CANOpenShellOD_Data, Initialisation);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   294
	}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   295
}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   296
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   297
/***************************  MASTER CLEANUP  *****************************************/
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   298
void Exit(CO_Data* d, UNS32 nodeid)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   299
{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   300
	if(strcmp(Board.baudrate, "none"))
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   301
	{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   302
		/* Reset all nodes on the network */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   303
		masterSendNMTstateChange(CANOpenShellOD_Data, (UNS8)nodeid, NMT_Reset_Node);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   304
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   305
		/* Stop master */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   306
		setState(CANOpenShellOD_Data, Stopped);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   307
	}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   308
}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   309
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   310
int ExtractNodeId(char *command) {
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   311
	int nodeid;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   312
	sscanf(command, "%2x", &nodeid);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   313
	return nodeid;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   314
}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   315
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   316
int NodeInit(CO_Data* d, int DeviceNodeID, int DeviceIsMaster)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   317
{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   318
	if(DeviceIsMaster)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   319
	{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   320
		CANOpenShellOD_Data = &CANOpenShellMasterOD_Data;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   321
	}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   322
	else
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   323
	{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   324
		CANOpenShellOD_Data = &CANOpenShellSlaveOD_Data;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   325
	}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   326
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   327
	/* Load can library */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   328
	LoadCanDriver(LibraryPath);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   329
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   330
	/* Init stack timer */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   331
	TimerInit();
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   332
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   333
	/* Define callback functions */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   334
	CANOpenShellOD_Data->initialisation = CANOpenShellOD_initialisation;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   335
	CANOpenShellOD_Data->preOperational = CANOpenShellOD_preOperational;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   336
	CANOpenShellOD_Data->operational = CANOpenShellOD_operational;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   337
	CANOpenShellOD_Data->stopped = CANOpenShellOD_stopped;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   338
	CANOpenShellOD_Data->post_sync = CANOpenShellOD_post_sync;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   339
	CANOpenShellOD_Data->post_TPDO = CANOpenShellOD_post_TPDO;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   340
	CANOpenShellOD_Data->post_SlaveBootup=CANOpenShellOD_post_SlaveBootup;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   341
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   342
	/* Open the Peak CANOpen device */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   343
	if(!canOpen(&Board,CANOpenShellOD_Data)) return 1;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   344
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   345
	/* Start Timer thread */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   346
	StartTimerLoop(&Init);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   347
	return 0;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   348
}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   349
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   350
void help_menu(void)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   351
{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   352
	printf("   MANDATORY COMMAND (must be the first command):\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   353
	printf("      load#Can library path,channel,baudrate,device nodeid,device type (m for master, s for slave)\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   354
	printf("\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   355
	printf("   NETWORK: (if nodeid=0x00 : broadcast)\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   356
	printf("     ssta#[nodeid] : Start a node\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   357
	printf("     ssto#[nodeid] : Stop a node\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   358
	printf("     srst#[nodeid] : Reset a node\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   359
	printf("     scan : Reset all nodes and print message when bootup\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   360
	printf("     wait#[seconds] : Sleep for n seconds\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   361
	printf("\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   362
	printf("   SDO: (size parameter : nb BYTES)\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   363
	printf("     info#[nodeid]\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   364
	printf("     rsdo#[nodeid][index][subindex] : read sdo\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   365
	printf("     wsdo#[nodeid][index][subindex][size][data] : write sdo\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   366
	printf("\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   367
	printf("     help : Display this menu\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   368
	printf("     quit : Quit application\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   369
	printf("\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   370
	printf("\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   371
}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   372
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   373
int ProcessCommand(char* command)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   374
{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   375
	int ret = 0;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   376
	int sec = 0;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   377
	int DeviceNodeID;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   378
	int DeviceType;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   379
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   380
	switch(cst_str4(command[0], command[1], command[2], command[3]))
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   381
	{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   382
		case cst_str4('l', 'o', 'a', 'd') : /* Library Interface*/
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   383
					ret = sscanf(command, "load#%100[^,],%10[^,],%4[^,],%d,%d",
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   384
							LibraryPath,
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   385
							BoardBusName,
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   386
							BoardBaudRate,
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   387
							&DeviceNodeID,
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   388
							&DeviceType);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   389
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   390
					if(ret == 5)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   391
					{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   392
						ret = NodeInit(CANOpenShellOD_Data, DeviceNodeID, DeviceType);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   393
						return ret;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   394
					}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   395
					else{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   396
						help_menu();
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   397
						exit(1);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   398
					}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   399
					break;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   400
		case cst_str4('h', 'e', 'l', 'p') : /* Display Help*/
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   401
					help_menu();
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   402
					break;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   403
		case cst_str4('s', 's', 't', 'a') : /* Slave Start*/
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   404
					StartNode(CANOpenShellOD_Data, ExtractNodeId(command + 5));
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   405
					break;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   406
		case cst_str4('s', 's', 't', 'o') : /* Slave Stop */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   407
					StopNode(CANOpenShellOD_Data, ExtractNodeId(command + 5));
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   408
					break;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   409
		case cst_str4('s', 'r', 's', 't') : /* Slave Reset */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   410
					ResetNode(CANOpenShellOD_Data, ExtractNodeId(command + 5));
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   411
					break;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   412
		case cst_str4('i', 'n', 'f', 'o') : /* Retrieve node informations */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   413
					GetSlaveNodeInfo(CANOpenShellOD_Data, ExtractNodeId(command + 5));
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   414
					break;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   415
		case cst_str4('r', 's', 'd', 'o') : /* Read device entry */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   416
					ReadDeviceEntry(CANOpenShellOD_Data, command + 5);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   417
					break;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   418
		case cst_str4('w', 's', 'd', 'o') : /* Write device entry */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   419
					WriteDeviceEntry(CANOpenShellOD_Data, command + 5);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   420
					break;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   421
		case cst_str4('s', 'c', 'a', 'n') : /* Display master node state */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   422
					DiscoverNodes(CANOpenShellOD_Data);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   423
					break;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   424
		case cst_str4('w', 'a', 'i', 't') : /* Display master node state */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   425
					ret = sscanf(command, "wait=%d", &sec);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   426
					if(ret == 1) SleepFunction(sec);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   427
					break;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   428
		case cst_str4('q', 'u', 'i', 't') : /* Quit application */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   429
					return QUIT;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   430
		default :
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   431
					help_menu();
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   432
	}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   433
	return 0;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   434
}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   435
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   436
/****************************************************************************/
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   437
/***************************  MAIN  *****************************************/
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   438
/****************************************************************************/
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   439
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   440
int main(int argc, char** argv)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   441
{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   442
	extern char *optarg;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   443
	char command[20];
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   444
	char* res;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   445
	int ret=0;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   446
	int sysret=0;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   447
	int i=0;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   448
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   449
	/* Print help and exit immediatly*/
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   450
	if(argc < 1)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   451
	{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   452
		help_menu();
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   453
		exit(1);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   454
	}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   455
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   456
	/* Strip command-line*/
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   457
	for(i=1 ; i<argc ; i++)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   458
	{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   459
		if(ProcessCommand(argv[i]) == INIT_ERR) goto init_fail;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   460
	}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   461
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   462
	#if !defined(WIN32) || defined(__CYGWIN__)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   463
		/* install signal handler for manual break */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   464
		signal(SIGTERM, catch_signal);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   465
		signal(SIGINT, catch_signal);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   466
	#endif
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   467
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   468
	/* Enter in a loop to read stdin command until "quit" is called */
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   469
	while(ret != QUIT)
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   470
	{
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   471
		// wait on stdin for string command
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   472
		res = fgets(command, sizeof(command), stdin);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   473
		sysret = system(CLEARSCREEN);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   474
		ret = ProcessCommand(command);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   475
		fflush(stdout);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   476
	}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   477
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   478
	printf("Finishing.\n");
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   479
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   480
	// Stop timer thread
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   481
	StopTimerLoop(&Exit);
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   482
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   483
init_fail:
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   484
	TimerCleanup();
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   485
	return 0;
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   486
}
ee24dcbd3e64 Add new example : CANOpen shell
greg
parents:
diff changeset
   487