#ifndef VCA_CANOPEN_H
#define VCA_CANOPEN_H

/* COB-ID bits 10-7 port (Function code) */
#define VCA_SDO_GET_PORT(id)            (id & 0xFF80)
/* COB-ID bits 6-0 node */
#define VCA_SDO_GET_NODE(id)            (id & 0x7F)

#define VCA_SDO_SIZE_INDICATOR          (1 << 0)    /* s */
#define VCA_SDO_EXPEDITED_TRANSFER      (1 << 1)    /* e */
#define VCA_SDO_LAST_SEGMENT_INDICATOR  (1 << 0)    /* c */
#define VCA_SDO_TOGGLE_BIT               (1 << 3)    /* t */
#define VCA_SDO_EXPEDITED_SIZE(head)    (4 - ((head & 0x0C) >> 2))
#define VCA_SDO_SEGMENTED_SIZE_(head)   (8 - ((head & 0x0E) >> 1))
#define VCA_SDO_COMMAND_OFFSET          5

/* commands
*  ..._R - request
*  ..._C - confirm
*/
#define VCA_SDO_GET_COMMAND(data0)    (data0 >> VCA_SDO_COMMAND_OFFSET)
#define VCA_SDO_COMMAND(cmd)          (cmd << VCA_SDO_COMMAND_OFFSET)

#define VCA_SDO_INIT_DOWNLOAD_R       1
#define VCA_SDO_INIT_DOWNLOAD_C       3
#define VCA_SDO_DOWNLOAD_SEGMENT_R    0
#define VCA_SDO_DOWNLOAD_SEGMENT_C    1

#define VCA_SDO_INIT_UPLOAD_R         2
#define VCA_SDO_INIT_UPLOAD_C         2
#define VCA_SDO_UPLOAD_SEGMENT_R      3
#define VCA_SDO_UPLOAD_SEGMENT_C      0

#define VCA_SDO_ABORT                 4

#endif

