MCPcopy Create free account
hub / github.com/CANopenNode/CANopenNode / OD_write_1201_additional

Function OD_write_1201_additional

301/CO_SDOserver.c:190–250  ·  view source on GitHub ↗

* Custom function for writing OD object _SDO server parameter_, additional channels * * For more information see file CO_ODinterface.h, OD_IO_t. */

Source from the content-addressed store, hash-verified

188 * For more information see file CO_ODinterface.h, OD_IO_t.
189 */
190static ODR_t
191OD_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

Callers

nothing calls this directly

Calls 4

CO_getUint32Function · 0.85
CO_getUint8Function · 0.85
OD_writeOriginalFunction · 0.85

Tested by

no test coverage detected