Sam Grove
/
canopen_slavenode
CANfestival - an open source CANopen framework
framework/include/lss.h@6:bc64031ac849, 2012-09-26 (annotated)
- Committer:
- sam_grove
- Date:
- Wed Sep 26 05:43:05 2012 +0000
- Revision:
- 6:bc64031ac849
- Parent:
- 0:6219434a0cb5
Change a typecast in can_mbed.cpp from unit8_t * to char * to fit the CANMessage constructor
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sam_grove |
0:6219434a0cb5 | 1 | /* |
sam_grove |
0:6219434a0cb5 | 2 | This file is part of CanFestival, a library implementing CanOpen Stack. |
sam_grove |
0:6219434a0cb5 | 3 | |
sam_grove |
0:6219434a0cb5 | 4 | Copyright (C): Jorge Berzosa |
sam_grove |
0:6219434a0cb5 | 5 | |
sam_grove |
0:6219434a0cb5 | 6 | See COPYING file for copyrights details. |
sam_grove |
0:6219434a0cb5 | 7 | |
sam_grove |
0:6219434a0cb5 | 8 | This library is free software; you can redistribute it and/or |
sam_grove |
0:6219434a0cb5 | 9 | modify it under the terms of the GNU Lesser General Public |
sam_grove |
0:6219434a0cb5 | 10 | License as published by the Free Software Foundation; either |
sam_grove |
0:6219434a0cb5 | 11 | version 2.1 of the License, or (at your option) any later version. |
sam_grove |
0:6219434a0cb5 | 12 | |
sam_grove |
0:6219434a0cb5 | 13 | This library is distributed in the hope that it will be useful, |
sam_grove |
0:6219434a0cb5 | 14 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
sam_grove |
0:6219434a0cb5 | 15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
sam_grove |
0:6219434a0cb5 | 16 | Lesser General Public License for more details. |
sam_grove |
0:6219434a0cb5 | 17 | |
sam_grove |
0:6219434a0cb5 | 18 | You should have received a copy of the GNU Lesser General Public |
sam_grove |
0:6219434a0cb5 | 19 | License along with this library; if not, write to the Free Software |
sam_grove |
0:6219434a0cb5 | 20 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
sam_grove |
0:6219434a0cb5 | 21 | */ |
sam_grove |
0:6219434a0cb5 | 22 | |
sam_grove |
0:6219434a0cb5 | 23 | /** @defgroup lss Layer Setting Services Object |
sam_grove |
0:6219434a0cb5 | 24 | * @brief LSS offers the possibility to inquire and change the settings of certain parameters of the local layers on |
sam_grove |
0:6219434a0cb5 | 25 | * a CANopen module with LSS Slave capabilities by a CANopen module with LSS Master capabilities via the |
sam_grove |
0:6219434a0cb5 | 26 | * CAN Network. |
sam_grove |
0:6219434a0cb5 | 27 | * The following parameters can be inquired and/or changed by the use of LSS: |
sam_grove |
0:6219434a0cb5 | 28 | * - Node-ID of the CANopen Slave |
sam_grove |
0:6219434a0cb5 | 29 | * - Bit timing parameters of the physical layer (baud rate) |
sam_grove |
0:6219434a0cb5 | 30 | * - LSS address (/2/ Identity Object, Index 1018H) |
sam_grove |
0:6219434a0cb5 | 31 | * @ingroup comobj |
sam_grove |
0:6219434a0cb5 | 32 | */ |
sam_grove |
0:6219434a0cb5 | 33 | |
sam_grove |
0:6219434a0cb5 | 34 | #ifndef __LSS_h__ |
sam_grove |
0:6219434a0cb5 | 35 | #define __LSS_h__ |
sam_grove |
0:6219434a0cb5 | 36 | |
sam_grove |
0:6219434a0cb5 | 37 | #define SLSS_ADRESS 0x7E4 |
sam_grove |
0:6219434a0cb5 | 38 | #define MLSS_ADRESS 0x7E5 |
sam_grove |
0:6219434a0cb5 | 39 | |
sam_grove |
0:6219434a0cb5 | 40 | #define SDELAY_OFF 0 |
sam_grove |
0:6219434a0cb5 | 41 | #define SDELAY_FIRST 1 |
sam_grove |
0:6219434a0cb5 | 42 | #define SDELAY_SECOND 2 |
sam_grove |
0:6219434a0cb5 | 43 | |
sam_grove |
0:6219434a0cb5 | 44 | #define LSS_WAITING_MODE 0 |
sam_grove |
0:6219434a0cb5 | 45 | #define LSS_CONFIGURATION_MODE 1 |
sam_grove |
0:6219434a0cb5 | 46 | |
sam_grove |
0:6219434a0cb5 | 47 | /* Switch mode services */ |
sam_grove |
0:6219434a0cb5 | 48 | #define LSS_SM_GLOBAL 4 |
sam_grove |
0:6219434a0cb5 | 49 | #define LSS_SM_SELECTIVE_VENDOR 64 |
sam_grove |
0:6219434a0cb5 | 50 | #define LSS_SM_SELECTIVE_PRODUCT 65 |
sam_grove |
0:6219434a0cb5 | 51 | #define LSS_SM_SELECTIVE_REVISION 66 |
sam_grove |
0:6219434a0cb5 | 52 | #define LSS_SM_SELECTIVE_SERIAL 67 |
sam_grove |
0:6219434a0cb5 | 53 | #define LSS_SM_SELECTIVE_RESP 68 |
sam_grove |
0:6219434a0cb5 | 54 | /* Configuration services */ |
sam_grove |
0:6219434a0cb5 | 55 | #define LSS_CONF_NODE_ID 17 |
sam_grove |
0:6219434a0cb5 | 56 | #define LSS_CONF_BIT_TIMING 19 |
sam_grove |
0:6219434a0cb5 | 57 | #define LSS_CONF_ACT_BIT_TIMING 21 |
sam_grove |
0:6219434a0cb5 | 58 | #define LSS_CONF_STORE 23 |
sam_grove |
0:6219434a0cb5 | 59 | /* Inquire services */ |
sam_grove |
0:6219434a0cb5 | 60 | #define LSS_INQ_VENDOR_ID 90 |
sam_grove |
0:6219434a0cb5 | 61 | #define LSS_INQ_PRODUCT_CODE 91 |
sam_grove |
0:6219434a0cb5 | 62 | #define LSS_INQ_REV_NUMBER 92 |
sam_grove |
0:6219434a0cb5 | 63 | #define LSS_INQ_SERIAL_NUMBER 93 |
sam_grove |
0:6219434a0cb5 | 64 | #define LSS_INQ_NODE_ID 94 |
sam_grove |
0:6219434a0cb5 | 65 | /* Identification services */ |
sam_grove |
0:6219434a0cb5 | 66 | #define LSS_IDENT_REMOTE_VENDOR 70 |
sam_grove |
0:6219434a0cb5 | 67 | #define LSS_IDENT_REMOTE_PRODUCT 71 |
sam_grove |
0:6219434a0cb5 | 68 | #define LSS_IDENT_REMOTE_REV_LOW 72 |
sam_grove |
0:6219434a0cb5 | 69 | #define LSS_IDENT_REMOTE_REV_HIGH 73 |
sam_grove |
0:6219434a0cb5 | 70 | #define LSS_IDENT_REMOTE_SERIAL_LOW 74 |
sam_grove |
0:6219434a0cb5 | 71 | #define LSS_IDENT_REMOTE_SERIAL_HIGH 75 |
sam_grove |
0:6219434a0cb5 | 72 | #define LSS_IDENT_REMOTE_NON_CONF 76 |
sam_grove |
0:6219434a0cb5 | 73 | #define LSS_IDENT_SLAVE 79 |
sam_grove |
0:6219434a0cb5 | 74 | #define LSS_IDENT_NON_CONF_SLAVE 80 |
sam_grove |
0:6219434a0cb5 | 75 | #define LSS_IDENT_FASTSCAN 81 |
sam_grove |
0:6219434a0cb5 | 76 | |
sam_grove |
0:6219434a0cb5 | 77 | /*FastScan State Machine*/ |
sam_grove |
0:6219434a0cb5 | 78 | #define LSS_FS_RESET 0 |
sam_grove |
0:6219434a0cb5 | 79 | #define LSS_FS_PROCESSING 1 |
sam_grove |
0:6219434a0cb5 | 80 | #define LSS_FS_CONFIRMATION 2 |
sam_grove |
0:6219434a0cb5 | 81 | |
sam_grove |
0:6219434a0cb5 | 82 | |
sam_grove |
0:6219434a0cb5 | 83 | typedef void (*LSSCallback_t)(CO_Data* d, UNS8 command); |
sam_grove |
0:6219434a0cb5 | 84 | |
sam_grove |
0:6219434a0cb5 | 85 | typedef void (*lss_StoreConfiguration_t)(CO_Data* d,UNS8*,UNS8*); |
sam_grove |
0:6219434a0cb5 | 86 | //void _lss_StoreConfiguration(UNS8 *error, UNS8 *spec_error); |
sam_grove |
0:6219434a0cb5 | 87 | |
sam_grove |
0:6219434a0cb5 | 88 | //typedef void (*lss_ChangeBaudRate_t)(CO_Data* d,char*); |
sam_grove |
0:6219434a0cb5 | 89 | //void _lss_ChangeBaudRate(char *BaudRate); |
sam_grove |
0:6219434a0cb5 | 90 | |
sam_grove |
0:6219434a0cb5 | 91 | |
sam_grove |
0:6219434a0cb5 | 92 | struct struct_lss_transfer; |
sam_grove |
0:6219434a0cb5 | 93 | |
sam_grove |
0:6219434a0cb5 | 94 | //#include "timer.h" |
sam_grove |
0:6219434a0cb5 | 95 | |
sam_grove |
0:6219434a0cb5 | 96 | #ifdef CO_ENABLE_LSS_FS |
sam_grove |
0:6219434a0cb5 | 97 | struct struct_lss_fs_transfer { |
sam_grove |
0:6219434a0cb5 | 98 | UNS32 FS_LSS_ID[4]; |
sam_grove |
0:6219434a0cb5 | 99 | UNS8 FS_BitChecked[4]; |
sam_grove |
0:6219434a0cb5 | 100 | }; |
sam_grove |
0:6219434a0cb5 | 101 | |
sam_grove |
0:6219434a0cb5 | 102 | typedef struct struct_lss_fs_transfer lss_fs_transfer_t; |
sam_grove |
0:6219434a0cb5 | 103 | #endif |
sam_grove |
0:6219434a0cb5 | 104 | |
sam_grove |
0:6219434a0cb5 | 105 | /* The Transfer structure |
sam_grove |
0:6219434a0cb5 | 106 | * Used to store the different fields of the internal state of the LSS |
sam_grove |
0:6219434a0cb5 | 107 | */ |
sam_grove |
0:6219434a0cb5 | 108 | |
sam_grove |
0:6219434a0cb5 | 109 | struct struct_lss_transfer { |
sam_grove |
0:6219434a0cb5 | 110 | UNS8 state; /* state of the transmission : Takes the values LSS_... */ |
sam_grove |
0:6219434a0cb5 | 111 | UNS8 command; /* the LSS command of the transmision */ |
sam_grove |
0:6219434a0cb5 | 112 | UNS8 mode; /* LSS mode */ |
sam_grove |
0:6219434a0cb5 | 113 | |
sam_grove |
0:6219434a0cb5 | 114 | UNS32 dat1; /* the data from the last msg received */ |
sam_grove |
0:6219434a0cb5 | 115 | UNS8 dat2; |
sam_grove |
0:6219434a0cb5 | 116 | |
sam_grove |
0:6219434a0cb5 | 117 | UNS8 nodeID; /* the new nodeid stored to update the nodeid when switching to LSS operational*/ |
sam_grove |
0:6219434a0cb5 | 118 | UNS8 addr_sel_match; /* the matching mask for the LSS Switch Mode Selective service */ |
sam_grove |
0:6219434a0cb5 | 119 | UNS8 addr_ident_match; /* the matching mask for the LSS Identify Remote Slaves service*/ |
sam_grove |
0:6219434a0cb5 | 120 | |
sam_grove |
0:6219434a0cb5 | 121 | char *baudRate; /* the new baudrate stored to update the node baudrate when a Activate Bit |
sam_grove |
0:6219434a0cb5 | 122 | * Timing Parameters is received*/ |
sam_grove |
0:6219434a0cb5 | 123 | UNS16 switchDelay; /* the period of the two delay */ |
sam_grove |
0:6219434a0cb5 | 124 | UNS8 switchDelayState; /* the state machine for the switchDelay */ |
sam_grove |
0:6219434a0cb5 | 125 | CAN_PORT canHandle_t; |
sam_grove |
0:6219434a0cb5 | 126 | |
sam_grove |
0:6219434a0cb5 | 127 | /* Time counters to implement a timeout in milliseconds.*/ |
sam_grove |
0:6219434a0cb5 | 128 | TIMER_HANDLE timerMSG; /* timerMSG is automatically incremented whenever |
sam_grove |
0:6219434a0cb5 | 129 | * the lss state is in LSS_TRANS_IN_PROGRESS, and reseted to 0 |
sam_grove |
0:6219434a0cb5 | 130 | * when the response LSS have been received. |
sam_grove |
0:6219434a0cb5 | 131 | */ |
sam_grove |
0:6219434a0cb5 | 132 | |
sam_grove |
0:6219434a0cb5 | 133 | TIMER_HANDLE timerSDELAY; /* timerSDELAY is automatically incremented whenever |
sam_grove |
0:6219434a0cb5 | 134 | * the lss switchDelayState is in SDELAY_FIRST or SDELAY_SECOND, and reseted to 0 |
sam_grove |
0:6219434a0cb5 | 135 | * when the two periods have been expired. |
sam_grove |
0:6219434a0cb5 | 136 | */ |
sam_grove |
0:6219434a0cb5 | 137 | |
sam_grove |
0:6219434a0cb5 | 138 | LSSCallback_t Callback; /* The user callback func to be called at LSS transaction end */ |
sam_grove |
0:6219434a0cb5 | 139 | |
sam_grove |
0:6219434a0cb5 | 140 | UNS8 LSSanswer; /* stores if a message has been received during a timer period */ |
sam_grove |
0:6219434a0cb5 | 141 | |
sam_grove |
0:6219434a0cb5 | 142 | #ifdef CO_ENABLE_LSS_FS |
sam_grove |
0:6219434a0cb5 | 143 | UNS32 IDNumber; /* in the master, the LSS address parameter which it currently tries to identify. |
sam_grove |
0:6219434a0cb5 | 144 | * in the slave, the LSS address parameter which is being checked (LSS-ID[sub]). */ |
sam_grove |
0:6219434a0cb5 | 145 | UNS8 BitChecked; /* bits of the current IDNumber that are currently checked */ |
sam_grove |
0:6219434a0cb5 | 146 | UNS8 LSSSub; /* which part of the LSS-ID is currently checked in IDNumber */ |
sam_grove |
0:6219434a0cb5 | 147 | UNS8 LSSNext; /* which LSSSub value will be used in the next request */ |
sam_grove |
0:6219434a0cb5 | 148 | UNS8 LSSPos; /* in the slave, which part of the LSS-ID is currently processed*/ |
sam_grove |
0:6219434a0cb5 | 149 | UNS8 FastScan_SM; /* the state machine for the FastScan protocol */ |
sam_grove |
0:6219434a0cb5 | 150 | TIMER_HANDLE timerFS; /* timerFS is automatically incremented when the FastScan service |
sam_grove |
0:6219434a0cb5 | 151 | * has been requested and reseted to 0 when the protocol ends. |
sam_grove |
0:6219434a0cb5 | 152 | */ |
sam_grove |
0:6219434a0cb5 | 153 | #ifdef CO_ENABLE_LSS_FS |
sam_grove |
0:6219434a0cb5 | 154 | lss_fs_transfer_t lss_fs_transfer; |
sam_grove |
0:6219434a0cb5 | 155 | #endif |
sam_grove |
0:6219434a0cb5 | 156 | |
sam_grove |
0:6219434a0cb5 | 157 | #endif |
sam_grove |
0:6219434a0cb5 | 158 | }; |
sam_grove |
0:6219434a0cb5 | 159 | |
sam_grove |
0:6219434a0cb5 | 160 | #ifdef CO_ENABLE_LSS |
sam_grove |
0:6219434a0cb5 | 161 | typedef struct struct_lss_transfer lss_transfer_t; |
sam_grove |
0:6219434a0cb5 | 162 | #else |
sam_grove |
0:6219434a0cb5 | 163 | typedef UNS8 lss_transfer_t; |
sam_grove |
0:6219434a0cb5 | 164 | #endif |
sam_grove |
0:6219434a0cb5 | 165 | |
sam_grove |
0:6219434a0cb5 | 166 | |
sam_grove |
0:6219434a0cb5 | 167 | |
sam_grove |
0:6219434a0cb5 | 168 | void startLSS(CO_Data* d); |
sam_grove |
0:6219434a0cb5 | 169 | void stopLSS(CO_Data* d); |
sam_grove |
0:6219434a0cb5 | 170 | |
sam_grove |
0:6219434a0cb5 | 171 | |
sam_grove |
0:6219434a0cb5 | 172 | /** transmit a LSS message |
sam_grove |
0:6219434a0cb5 | 173 | * command is the LSS command specifier |
sam_grove |
0:6219434a0cb5 | 174 | * dat1 and dat2 are pointers to optional data (depend on command) |
sam_grove |
0:6219434a0cb5 | 175 | * return sendLSSMessage(d,command,dat1,dat2) |
sam_grove |
0:6219434a0cb5 | 176 | */ |
sam_grove |
0:6219434a0cb5 | 177 | UNS8 sendLSS (CO_Data* d, UNS8 command,void *dat1, void *dat2); |
sam_grove |
0:6219434a0cb5 | 178 | |
sam_grove |
0:6219434a0cb5 | 179 | /** transmit a LSS message on CAN bus |
sam_grove |
0:6219434a0cb5 | 180 | * comamnd is the LSS command specifier |
sam_grove |
0:6219434a0cb5 | 181 | * bus_id is MLSS_ADRESS or SLSS_ADRESS depending in d->iam_a_slave. |
sam_grove |
0:6219434a0cb5 | 182 | * dat1 and dat2 are pointers to optional data (depend on command). |
sam_grove |
0:6219434a0cb5 | 183 | * return canSend(bus_id,&m) |
sam_grove |
0:6219434a0cb5 | 184 | */ |
sam_grove |
0:6219434a0cb5 | 185 | |
sam_grove |
0:6219434a0cb5 | 186 | UNS8 sendLSSMessage(CO_Data* d, UNS8 command, void *dat1, void *dat2); |
sam_grove |
0:6219434a0cb5 | 187 | |
sam_grove |
0:6219434a0cb5 | 188 | /** This function is called when the node is receiving a Master LSS message (cob-id = 0x7E5). |
sam_grove |
0:6219434a0cb5 | 189 | * - Check if there is a callback which will take care of the response. If not return 0 but does nothing. |
sam_grove |
0:6219434a0cb5 | 190 | * - Stops the timer so the alarm wont raise an error. |
sam_grove |
0:6219434a0cb5 | 191 | * - return 0 if OK |
sam_grove |
0:6219434a0cb5 | 192 | */ |
sam_grove |
0:6219434a0cb5 | 193 | UNS8 proceedLSS_Master (CO_Data* d, Message* m ); |
sam_grove |
0:6219434a0cb5 | 194 | |
sam_grove |
0:6219434a0cb5 | 195 | /** This function is called when the node is receiving a Slave LSS message (cob-id = 0x7E4). |
sam_grove |
0:6219434a0cb5 | 196 | * - Call the callback function or send the response message depending on the LSS comand within m. |
sam_grove |
0:6219434a0cb5 | 197 | * - return 0 if OK |
sam_grove |
0:6219434a0cb5 | 198 | */ |
sam_grove |
0:6219434a0cb5 | 199 | UNS8 proceedLSS_Slave (CO_Data* d, Message* m ); |
sam_grove |
0:6219434a0cb5 | 200 | |
sam_grove |
0:6219434a0cb5 | 201 | /** Used by the Master application to send a LSS command, WITHOUT response, to the slave. |
sam_grove |
0:6219434a0cb5 | 202 | * command: the LSS command. LSS_... |
sam_grove |
0:6219434a0cb5 | 203 | * dat1 and dat2: pointers to optional data (depend on command). |
sam_grove |
0:6219434a0cb5 | 204 | * return sendLSS(d,command,dat1,dat2) |
sam_grove |
0:6219434a0cb5 | 205 | */ |
sam_grove |
0:6219434a0cb5 | 206 | //UNS8 configNetworkNode(CO_Data* d, UNS8 command, void *dat1, void* dat2); |
sam_grove |
0:6219434a0cb5 | 207 | |
sam_grove |
0:6219434a0cb5 | 208 | /** |
sam_grove |
0:6219434a0cb5 | 209 | * @ingroup lss |
sam_grove |
0:6219434a0cb5 | 210 | * @brief Used by the Master application to send a LSS command, WITH response, to the slave. |
sam_grove |
0:6219434a0cb5 | 211 | * @param *d Pointer on a CAN object data structure |
sam_grove |
0:6219434a0cb5 | 212 | * @param command |
sam_grove |
0:6219434a0cb5 | 213 | * @param *dat1 |
sam_grove |
0:6219434a0cb5 | 214 | * @param *dat2 |
sam_grove |
0:6219434a0cb5 | 215 | * @param Callback The function Callback, which must be defined in the user code, is called at the |
sam_grove |
0:6219434a0cb5 | 216 | * end of the exchange (on succes or abort) and can be NULL. |
sam_grove |
0:6219434a0cb5 | 217 | * @return sendLSS(d,command,dat1,dat2) |
sam_grove |
0:6219434a0cb5 | 218 | * The LSS_MSG_TIMER timer is started to control the timeout |
sam_grove |
0:6219434a0cb5 | 219 | */ |
sam_grove |
0:6219434a0cb5 | 220 | UNS8 configNetworkNode (CO_Data* d, UNS8 command, void *dat1, void* dat2, LSSCallback_t Callback); |
sam_grove |
0:6219434a0cb5 | 221 | |
sam_grove |
0:6219434a0cb5 | 222 | /** |
sam_grove |
0:6219434a0cb5 | 223 | * @ingroup lss |
sam_grove |
0:6219434a0cb5 | 224 | * @brief Use this function after a configNetworkNode or configNetworkNodeCallBack to get the result. |
sam_grove |
0:6219434a0cb5 | 225 | * @param *d Pointer on a CAN object data structure |
sam_grove |
0:6219434a0cb5 | 226 | * @param command The LSS command (unused). |
sam_grove |
0:6219434a0cb5 | 227 | * @param *dat1 |
sam_grove |
0:6219434a0cb5 | 228 | * @param *dat2 |
sam_grove |
0:6219434a0cb5 | 229 | * @return : |
sam_grove |
0:6219434a0cb5 | 230 | * - LSS_RESET // Transmission not started. Init state. |
sam_grove |
0:6219434a0cb5 | 231 | * - LSS_FINISHED // data are available |
sam_grove |
0:6219434a0cb5 | 232 | * - LSS_ABORTED_INTERNAL // Aborted but not because of an abort message. |
sam_grove |
0:6219434a0cb5 | 233 | * - LSS_TRANS_IN_PROGRESS // Data not yet available |
sam_grove |
0:6219434a0cb5 | 234 | * @code |
sam_grove |
0:6219434a0cb5 | 235 | * example: |
sam_grove |
0:6219434a0cb5 | 236 | * UNS32 dat1; |
sam_grove |
0:6219434a0cb5 | 237 | * UNS8 dat2; |
sam_grove |
0:6219434a0cb5 | 238 | * res=configNetworkNodeCallBack(&_Data,LSS_INQ_NODE_ID,0,0,NULL); // inquire the nodeID |
sam_grove |
0:6219434a0cb5 | 239 | * while (getConfigResultNetworkNode (&_Data, LSS_INQ_NODE_ID, &dat1, &dat2) != LSS_TRANS_IN_PROGRESS); |
sam_grove |
0:6219434a0cb5 | 240 | * @endcode |
sam_grove |
0:6219434a0cb5 | 241 | */ |
sam_grove |
0:6219434a0cb5 | 242 | UNS8 getConfigResultNetworkNode (CO_Data* d, UNS8 command, UNS32* dat1, UNS8* dat2); |
sam_grove |
0:6219434a0cb5 | 243 | |
sam_grove |
0:6219434a0cb5 | 244 | #endif |