* Custom function for writing OD object _SDO server parameter_, additional channels * * For more information see file CO_ODinterface.h, OD_IO_t. */
| 188 | * For more information see file CO_ODinterface.h, OD_IO_t. |
| 189 | */ |
| 190 | static ODR_t |
| 191 | OD_write_1201_additional(OD_stream_t* stream, const void* buf, OD_size_t count, OD_size_t* countWritten) { |
| 192 | /* "count" is already verified in *_init() function */ |
| 193 | if ((stream == NULL) || (buf == NULL) || (countWritten == NULL)) { |
| 194 | return ODR_DEV_INCOMPAT; |
| 195 | } |
| 196 | |
| 197 | CO_SDOserver_t* SDO = (CO_SDOserver_t*)stream->object; |
| 198 | |
| 199 | switch (stream->subIndex) { |
| 200 | case 0: /* Highest sub-index supported */ return ODR_READONLY; break; |
| 201 | |
| 202 | case 1: { /* COB-ID client -> server */ |
| 203 | uint32_t COB_ID = CO_getUint32(buf); |
| 204 | uint16_t CAN_ID = (uint16_t)(COB_ID & 0x7FFU); |
| 205 | uint16_t CAN_ID_cur = (uint16_t)(SDO->COB_IDClientToServer & 0x7FFU); |
| 206 | bool_t valid = (COB_ID & 0x80000000U) == 0U; |
| 207 | |
| 208 | /* SDO client must not be valid when changing COB_ID */ |
| 209 | if (((COB_ID & 0x3FFFF800U) != 0U) || ((valid && SDO->valid) && (CAN_ID != CAN_ID_cur)) |
| 210 | || (valid && CO_IS_RESTRICTED_CAN_ID(CAN_ID))) { |
| 211 | return ODR_INVALID_VALUE; |
| 212 | } |
| 213 | (void)CO_SDOserver_init_canRxTx(SDO, SDO->CANdevRx, SDO->CANdevRxIdx, SDO->CANdevTxIdx, COB_ID, |
| 214 | SDO->COB_IDServerToClient); |
| 215 | break; |
| 216 | } |
| 217 | |
| 218 | case 2: { /* COB-ID server -> client */ |
| 219 | uint32_t COB_ID = CO_getUint32(buf); |
| 220 | uint16_t CAN_ID = (uint16_t)(COB_ID & 0x7FFU); |
| 221 | uint16_t CAN_ID_cur = (uint16_t)(SDO->COB_IDServerToClient & 0x7FFU); |
| 222 | bool_t valid = (COB_ID & 0x80000000U) == 0U; |
| 223 | |
| 224 | /* SDO client must not be valid when changing COB_ID */ |
| 225 | if (((COB_ID & 0x3FFFF800U) != 0U) || (valid && (SDO->valid && (CAN_ID != CAN_ID_cur))) |
| 226 | || (valid && CO_IS_RESTRICTED_CAN_ID(CAN_ID))) { |
| 227 | return ODR_INVALID_VALUE; |
| 228 | } |
| 229 | (void)CO_SDOserver_init_canRxTx(SDO, SDO->CANdevRx, SDO->CANdevRxIdx, SDO->CANdevTxIdx, |
| 230 | SDO->COB_IDClientToServer, COB_ID); |
| 231 | break; |
| 232 | } |
| 233 | |
| 234 | case 3: { /* Node-ID of the SDO server */ |
| 235 | if (count != 1U) { |
| 236 | return ODR_TYPE_MISMATCH; |
| 237 | } |
| 238 | uint8_t nodeId = CO_getUint8(buf); |
| 239 | if ((nodeId < 1U) || (nodeId > 127U)) { |
| 240 | return ODR_INVALID_VALUE; |
| 241 | } |
| 242 | break; |
| 243 | } |
| 244 | |
| 245 | default: return ODR_SUB_NOT_EXIST; break; |
| 246 | } |
| 247 |
nothing calls this directly
no test coverage detected