include/sdo.h
changeset 0 4472ee7c6c3e
child 32 8afa33692372
equal deleted inserted replaced
-1:000000000000 0:4472ee7c6c3e
       
     1 /*
       
     2 This file is part of CanFestival, a library implementing CanOpen Stack. 
       
     3 
       
     4 Copyright (C): Edouard TISSERANT and Francis DUPIN
       
     5 
       
     6 See COPYING file for copyrights details.
       
     7 
       
     8 This library is free software; you can redistribute it and/or
       
     9 modify it under the terms of the GNU Lesser General Public
       
    10 License as published by the Free Software Foundation; either
       
    11 version 2.1 of the License, or (at your option) any later version.
       
    12 
       
    13 This library is distributed in the hope that it will be useful,
       
    14 but WITHOUT ANY WARRANTY; without even the implied warranty of
       
    15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
       
    16 Lesser General Public License for more details.
       
    17 
       
    18 You should have received a copy of the GNU Lesser General Public
       
    19 License along with this library; if not, write to the Free Software
       
    20 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
       
    21 */
       
    22 
       
    23 #ifndef __sdo_h__
       
    24 #define __sdo_h__
       
    25 
       
    26 typedef void (*SDOtimeoutError_t)(UNS8 line);
       
    27 struct struct_s_transfer;
       
    28 
       
    29 #include "timer.h"
       
    30 
       
    31 /* The Transfer structure
       
    32 Used to store the different segments of 
       
    33  - a SDO received before writing in the dictionary  
       
    34  - the reading of the dictionary to put on a SDO to transmit 
       
    35 */
       
    36 
       
    37 struct struct_s_transfer {
       
    38   UNS8           nodeId;     //own ID if server, or node ID of the server if client
       
    39   
       
    40   UNS8           whoami;     // Takes the values SDO_CLIENT or SDO_SERVER
       
    41   UNS8           state;      // state of the transmission : Takes the values SDO_...
       
    42   UNS8           toggle;
       
    43   UNS32          abortCode;  // Sent or received
       
    44   // index and subindex of the dictionary where to store
       
    45   // (for a received SDO) or to read (for a transmit SDO)
       
    46   UNS16          index; 
       
    47   UNS8           subIndex; 
       
    48   UNS32          count;      // Number of data received or to be sent.
       
    49   UNS32          offset;     // stack pointer of data[]
       
    50                              // Used only to tranfer part of a line to or from a SDO.
       
    51                              // offset is always pointing on the next free cell of data[].
       
    52                              // WARNING s_transfer.data is subject to ENDIANISATION 
       
    53                              // (with respect to CANOPEN_BIG_ENDIAN)
       
    54   UNS8           data [SDO_MAX_LENGTH_TRANSFERT];
       
    55   UNS8           dataType;   // Defined in objdictdef.h Value is visible_string 
       
    56                              // if it is a string, any other value if it is not a string, 
       
    57                              // like 0. In fact, it is used only if client.
       
    58   TIMER_HANDLE   timer;    // Time counter to implement a timeout in milliseconds.
       
    59                              // It is automatically incremented whenever 
       
    60                              // the line state is in SDO_DOWNLOAD_IN_PROGRESS or 
       
    61                              // SDO_UPLOAD_IN_PROGRESS, and reseted to 0 
       
    62                              // when the response SDO have been received.
       
    63 };
       
    64 typedef struct struct_s_transfer s_transfer;
       
    65   
       
    66 
       
    67 #include "data.h"
       
    68 
       
    69 /// The 8 bytes data of the SDO
       
    70 struct BODY{
       
    71     UNS8 data[8];
       
    72 };
       
    73 
       
    74 /// The SDO structure ...
       
    75 struct struct_s_SDO {
       
    76   UNS8 nodeId;		//in any case, Node ID of the server (case sender or receiver).
       
    77   struct BODY body;
       
    78 };
       
    79 
       
    80 
       
    81 typedef struct struct_s_SDO s_SDO;
       
    82 
       
    83 /** Reset all sdo buffers
       
    84  */
       
    85 void resetSDO (CO_Data* d);
       
    86 
       
    87 
       
    88 /** Copy the data received from the SDO line transfert to the object dictionary
       
    89  * Returns SDO error code if error. Else, returns 0; 
       
    90  */
       
    91 UNS32 SDOlineToObjdict (CO_Data* d, UNS8 line);
       
    92 
       
    93 /** Copy the data from the object dictionary to the SDO line for a network transfert.
       
    94  * Returns SDO error code if error. Else, returns 0; 
       
    95  */
       
    96 UNS32 objdictToSDOline (CO_Data* d, UNS8 line);
       
    97 
       
    98 /** copy data from an existant line in the argument "* data"
       
    99  * Returns 0xFF if error. Else, returns 0; 
       
   100  */
       
   101 UNS8 lineToSDO (CO_Data* d, UNS8 line, UNS8 nbBytes, UNS8 * data);
       
   102 
       
   103 /** Add data to an existant line
       
   104  * Returns 0xFF if error. Else, returns 0; 
       
   105  */
       
   106 UNS8 SDOtoLine (CO_Data* d, UNS8 line, UNS8 nbBytes, UNS8 * data);
       
   107 
       
   108 /** Called when an internal SDO abort occurs.
       
   109  * Release the line * Only if server * 
       
   110  * If client, the line must be released manually in the core application.
       
   111  * The reason of that is to permit the program to read the transfers[][] structure before its reset,
       
   112  * because many informations are stored on it : index, subindex, data received or trasmited, ...
       
   113  * In all cases, sends a SDO abort.
       
   114  * Returns 0
       
   115  */
       
   116 UNS8 failedSDO (CO_Data* d, UNS8 nodeId, UNS8 whoami, UNS16 index, 
       
   117 		UNS8 subIndex, UNS32 abortCode);
       
   118 
       
   119 /** Reset an unused line.
       
   120  * 
       
   121  */
       
   122 void resetSDOline (CO_Data* d, UNS8 line);
       
   123 
       
   124 /** Initialize some fields of the structure.
       
   125  * Returns 0
       
   126  */
       
   127 UNS8 initSDOline (CO_Data* d, UNS8 line, UNS8 nodeId, UNS16 index, UNS8 subIndex, UNS8 state);
       
   128 
       
   129 /** Search for an unused line in the transfers array
       
   130  * to store a new SDO.
       
   131  * ie a line which value of the field "state" is "SDO_RESET"
       
   132  * An unused line have the field "state" at the value SDO_RESET
       
   133  * bus_id is hardware dependant
       
   134  * whoami : create the line for a SDO_SERVER or SDO_CLIENT.
       
   135  * return 0xFF if all the lines are on use. Else, return 0
       
   136  */
       
   137 UNS8 getSDOfreeLine (CO_Data* d, UNS8 whoami, UNS8 *line);
       
   138 
       
   139 /** Search for the line, in the transfers array, which contains the
       
   140  * beginning of the reception of a fragmented SDO
       
   141  * whoami takes 2 values : look for a line opened as SDO_CLIENT or SDO_SERVER
       
   142  * bus_id is hardware dependant
       
   143  * nodeId correspond to the message node-id 
       
   144  * return 0xFF if error.  Else, return 0
       
   145  */
       
   146 UNS8 getSDOlineOnUse (CO_Data* d, UNS8 nodeId, UNS8 whoami, UNS8 *line);
       
   147 
       
   148 /** Close a transmission.
       
   149  * nodeId : Node id of the server if both server or client
       
   150  * whoami : Line opened as SDO_CLIENT or SDO_SERVER
       
   151  */
       
   152 UNS8 closeSDOtransfer (CO_Data* d, UNS8 nodeId, UNS8 whoami);
       
   153 
       
   154 /** Bytes in the line structure which must be transmited (or received)
       
   155  * bus_id is hardware dependant.
       
   156  * return 0.
       
   157  */
       
   158 UNS8 getSDOlineRestBytes (CO_Data* d, UNS8 line, UNS8 * nbBytes);
       
   159 
       
   160 /** Store in the line structure the nb of bytes which must be transmited (or received)
       
   161  * bus_id is hardware dependant.
       
   162  * return 0 if success, 0xFF if error.
       
   163  */
       
   164 UNS8 setSDOlineRestBytes (CO_Data* d, UNS8 line, UNS8 nbBytes);
       
   165 
       
   166 /** Transmit a SDO frame on the bus bus_id
       
   167  * sdo is a structure which contains the sdo to transmit
       
   168  * bus_id is hardware dependant
       
   169  * whoami takes 2 values : SDO_CLIENT or SDO_SERVER
       
   170  * return canSend(bus_id,&m) or 0xFF if error
       
   171  */
       
   172 UNS8 sendSDO (CO_Data* d, UNS8 whoami, s_SDO sdo);
       
   173 
       
   174 /** Transmit a SDO error to the client. The reasons may be :
       
   175  * Read/Write to a undefined object
       
   176  * Read/Write to a undefined subindex
       
   177  * Read/write a not valid length object
       
   178  * Write a read only object
       
   179  * whoami takes 2 values : SDO_CLIENT or SDO_SERVER
       
   180  */
       
   181 UNS8 sendSDOabort (CO_Data* d, UNS8 whoami, UNS16 index, UNS8 subIndex, UNS32 abortCode);
       
   182 
       
   183 /** Treat a SDO frame reception
       
   184  * bus_id is hardware dependant
       
   185  * call the function sendSDO
       
   186  * return 0xFF if error
       
   187  *        0x80 if transfert aborted by the server
       
   188  *        0x0  ok
       
   189  */
       
   190 UNS8 proceedSDO (CO_Data* d, Message *m);
       
   191 
       
   192 /** Used by the application to send a SDO request frame to write the data *data
       
   193  * at the index and subIndex indicated
       
   194  * in the dictionary of the slave whose node_id is nodeId
       
   195  * Count : nb of bytes to write in the dictionnary.
       
   196  * datatype (defined in objdictdef.h) : put "visible_string" for strings, 0 for integers or reals or other value.
       
   197  * bus_id is hardware dependant
       
   198  * return 0xFF if error, else return 0
       
   199  */
       
   200 UNS8 writeNetworkDict (CO_Data* d, UNS8 nodeId, UNS16 index, 
       
   201 		       UNS8 subIndex, UNS8 count, UNS8 dataType, void *data); 
       
   202 
       
   203 /** Used by the application to send a SDO request frame to read
       
   204  * in the dictionary of a server node whose node_id is ID
       
   205  * at the index and subIndex indicated
       
   206  * bus_id is hardware dependant
       
   207  * datatype (defined in objdictdef.h) : put "visible_string" for strings, 0 for integers or reals or other value.
       
   208  * return 0xFF if error, else return 0
       
   209  */
       
   210 UNS8 readNetworkDict (CO_Data* d, UNS8 nodeId, UNS16 index, 
       
   211 		      UNS8 subIndex, UNS8 dataType);
       
   212 
       
   213 /** Use this function after a readNetworkDict to get the result.
       
   214   Returns : SDO_FINISHED             // data is available
       
   215             SDO_ABORTED_RCV          // Transfert failed. (abort SDO received)
       
   216             SDO_ABORTED_INTERNAL     // Transfert failed. Internal abort.
       
   217             SDO_UPLOAD_IN_PROGRESS   // Data not yet available
       
   218 	    SDO_DOWNLOAD_IN_PROGRESS // Should not arrive ! 
       
   219 
       
   220   dataType (defined in objdictdef.h) : type expected. put "visible_string" for strings, 0 for integers or reals.
       
   221   abortCode : 0 = not available. Else : SDO abort code. (received if return SDO_ABORTED_RCV)
       
   222   example :
       
   223   UNS32 data;
       
   224   UNS8 size;
       
   225   readNetworkDict(0, 0x05, 0x1016, 1, 0) // get the data index 1016 subindex 1 of node 5
       
   226   while (getReadResultNetworkDict (0, 0x05, &data, &size) != SDO_UPLOAD_IN_PROGRESS);
       
   227 */
       
   228 UNS8 getReadResultNetworkDict (CO_Data* d, UNS8 nodeId, void* data, 
       
   229 			       UNS8 *size, UNS32 * abortCode);
       
   230 
       
   231 /**
       
   232   Use this function after a writeNetworkDict to get the result of the write
       
   233   It is mandatory to call this function because it is releasing the line used for the transfer.
       
   234   Returns : SDO_FINISHED             // data is available
       
   235             SDO_ABORTED_RCV          // Transfert failed. (abort SDO received)
       
   236             SDO_ABORTED_INTERNAL     // Transfert failed. Internal abort.
       
   237             SDO_DOWNLOAD_IN_PROGRESS // Data not yet available
       
   238 	    SDO_UPLOAD_IN_PROGRESS   // Should not arrive ! 
       
   239   abortCode : 0 = not available. Else : SDO abort code. (received if return SDO_ABORTED_RCV)
       
   240   example :
       
   241   UNS32 data = 0x50;
       
   242   UNS8 size;
       
   243   UNS32 abortCode;
       
   244   writeNetworkDict(0, 0x05, 0x1016, 1, size, &data) // write the data index 1016 subindex 1 of node 5
       
   245   while ( getWriteResultNetworkDict (0, 0x05, &abortCode) != SDO_DOWNLOAD_IN_PROGRESS);  
       
   246 */
       
   247 UNS8 getWriteResultNetworkDict (CO_Data* d, UNS8 nodeId, UNS32 * abortCode);
       
   248 
       
   249 #endif