/**************************************************************************** * apps/examples/lely_master/sdev_master.c * * SPDX-License-Identifier: Apache-2.0 * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. The * ASF licenses this file to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. * ****************************************************************************/ /**************************************************************************** * Included Files ****************************************************************************/ #include #include "sdev.h" /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ #define CO_SDEV_STRING(s) s /**************************************************************************** * Private Data ****************************************************************************/ /* Object 0x1000 sub-objects */ static const struct co_ssub g_1000_sub[] = { { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("Device type"), #endif .subidx = 0x00, .type = CO_DEFTYPE_UNSIGNED32, #if !LELY_NO_CO_OBJ_LIMITS .min.u32 = CO_UNSIGNED32_MIN, .max.u32 = CO_UNSIGNED32_MAX, #endif #if !LELY_NO_CO_OBJ_DEFAULT .def.u32 = CO_UNSIGNED32_MIN, #endif .val.u32 = CO_UNSIGNED32_MIN, .access = CO_ACCESS_RO, .pdo_mapping = 0, .flags = 0 } }; /* Object 0x1001 sub-objects */ static const struct co_ssub g_1001_sub[] = { { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("Error register"), #endif .subidx = 0x00, .type = CO_DEFTYPE_UNSIGNED8, #if !LELY_NO_CO_OBJ_LIMITS .min.u8 = CO_UNSIGNED8_MIN, .max.u8 = CO_UNSIGNED8_MAX, #endif #if !LELY_NO_CO_OBJ_DEFAULT .def.u8 = CO_UNSIGNED8_MIN, #endif .val.u8 = CO_UNSIGNED8_MIN, .access = CO_ACCESS_RO, .pdo_mapping = 0, .flags = 0 } }; /* Object 0x1005 sub-objects */ static const struct co_ssub g_1005_sub[] = { { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("COB-ID SYNC message"), #endif .subidx = 0x00, .type = CO_DEFTYPE_UNSIGNED32, #if !LELY_NO_CO_OBJ_LIMITS .min.u32 = CO_UNSIGNED32_MIN, .max.u32 = CO_UNSIGNED32_MAX, #endif #if !LELY_NO_CO_OBJ_DEFAULT .def.u32 = 0x40000080lu, #endif .val.u32 = 0x40000080lu, .access = CO_ACCESS_RW, .pdo_mapping = 0, .flags = 0 } }; /* Object 0x1006 sub-objects */ static const struct co_ssub g_1006_sub[] = { { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("Communication cycle period"), #endif .subidx = 0x00, .type = CO_DEFTYPE_UNSIGNED32, #if !LELY_NO_CO_OBJ_LIMITS .min.u32 = CO_UNSIGNED32_MIN, .max.u32 = CO_UNSIGNED32_MAX, #endif #if !LELY_NO_CO_OBJ_DEFAULT .def.u32 = 0x000186a0lu, #endif .val.u32 = 0x000186a0lu, .access = CO_ACCESS_RW, .pdo_mapping = 0, .flags = 0 } }; /* Object 0x1012 sub-objects */ static const struct co_ssub g_1012_sub[] = { { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("COB-ID time stamp object"), #endif .subidx = 0x00, .type = CO_DEFTYPE_UNSIGNED32, #if !LELY_NO_CO_OBJ_LIMITS .min.u32 = CO_UNSIGNED32_MIN, .max.u32 = CO_UNSIGNED32_MAX, #endif #if !LELY_NO_CO_OBJ_DEFAULT .def.u32 = 0x80000100lu, #endif .val.u32 = 0x80000100lu, .access = CO_ACCESS_RW, .pdo_mapping = 0, .flags = 0 } }; /* Object 0x1017 sub-objects */ static const struct co_ssub g_1017_sub[] = { { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("Producer heartbeat time"), #endif .subidx = 0x00, .type = CO_DEFTYPE_UNSIGNED16, #if !LELY_NO_CO_OBJ_LIMITS .min.u16 = CO_UNSIGNED16_MIN, .max.u16 = CO_UNSIGNED16_MAX, #endif #if !LELY_NO_CO_OBJ_DEFAULT .def.u16 = 0x0032, #endif .val.u16 = 0x0032, .access = CO_ACCESS_RW, .pdo_mapping = 0, .flags = 0 } }; /* Object 0x1018 sub-objects */ static const struct co_ssub g_1018_sub[] = { { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("Highest sub-index supported"), #endif .subidx = 0x00, .type = CO_DEFTYPE_UNSIGNED8, #if !LELY_NO_CO_OBJ_LIMITS .min.u8 = CO_UNSIGNED8_MIN, .max.u8 = CO_UNSIGNED8_MAX, #endif #if !LELY_NO_CO_OBJ_DEFAULT .def.u8 = 0x04, #endif .val.u8 = 0x04, .access = CO_ACCESS_CONST, .pdo_mapping = 0, .flags = 0 }, { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("Vendor-ID"), #endif .subidx = 0x01, .type = CO_DEFTYPE_UNSIGNED32, #if !LELY_NO_CO_OBJ_LIMITS .min.u32 = CO_UNSIGNED32_MIN, .max.u32 = CO_UNSIGNED32_MAX, #endif #if !LELY_NO_CO_OBJ_DEFAULT .def.u32 = 0x00000360lu, #endif .val.u32 = 0x00000360lu, .access = CO_ACCESS_RO, .pdo_mapping = 0, .flags = 0 }, { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("Product code"), #endif .subidx = 0x02, .type = CO_DEFTYPE_UNSIGNED32, #if !LELY_NO_CO_OBJ_LIMITS .min.u32 = CO_UNSIGNED32_MIN, .max.u32 = CO_UNSIGNED32_MAX, #endif #if !LELY_NO_CO_OBJ_DEFAULT .def.u32 = CO_UNSIGNED32_MIN, #endif .val.u32 = CO_UNSIGNED32_MIN, .access = CO_ACCESS_RO, .pdo_mapping = 0, .flags = 0 }, { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("Revision number"), #endif .subidx = 0x03, .type = CO_DEFTYPE_UNSIGNED32, #if !LELY_NO_CO_OBJ_LIMITS .min.u32 = CO_UNSIGNED32_MIN, .max.u32 = CO_UNSIGNED32_MAX, #endif #if !LELY_NO_CO_OBJ_DEFAULT .def.u32 = CO_UNSIGNED32_MIN, #endif .val.u32 = CO_UNSIGNED32_MIN, .access = CO_ACCESS_RO, .pdo_mapping = 0, .flags = 0 }, { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("Serial number"), #endif .subidx = 0x04, .type = CO_DEFTYPE_UNSIGNED32, #if !LELY_NO_CO_OBJ_LIMITS .min.u32 = CO_UNSIGNED32_MIN, .max.u32 = CO_UNSIGNED32_MAX, #endif #if !LELY_NO_CO_OBJ_DEFAULT .def.u32 = CO_UNSIGNED32_MIN, #endif .val.u32 = CO_UNSIGNED32_MIN, .access = CO_ACCESS_RO, .pdo_mapping = 0, .flags = 0 } }; /* Object 0x1280 sub-objects */ static const struct co_ssub g_1280_sub[] = { { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("Highest sub-index supported"), #endif .subidx = 0x00, .type = CO_DEFTYPE_UNSIGNED8, #if !LELY_NO_CO_OBJ_LIMITS .min.u8 = CO_UNSIGNED8_MIN, .max.u8 = CO_UNSIGNED8_MAX, #endif #if !LELY_NO_CO_OBJ_DEFAULT .def.u8 = 0x03, #endif .val.u8 = 0x03, .access = CO_ACCESS_CONST, .pdo_mapping = 0, .flags = 0 }, { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("COB-ID client to server"), #endif .subidx = 0x01, .type = CO_DEFTYPE_UNSIGNED32, #if !LELY_NO_CO_OBJ_LIMITS .min.u32 = CO_UNSIGNED32_MIN, .max.u32 = CO_UNSIGNED32_MAX, #endif #if !LELY_NO_CO_OBJ_DEFAULT .def.u32 = 0x00000602lu, #endif .val.u32 = 0x00000602lu, .access = CO_ACCESS_RW, .pdo_mapping = 0, .flags = 0 }, { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("COB-ID server to client"), #endif .subidx = 0x02, .type = CO_DEFTYPE_UNSIGNED32, #if !LELY_NO_CO_OBJ_LIMITS .min.u32 = CO_UNSIGNED32_MIN, .max.u32 = CO_UNSIGNED32_MAX, #endif #if !LELY_NO_CO_OBJ_DEFAULT .def.u32 = 0x00000582lu, #endif .val.u32 = 0x00000582lu, .access = CO_ACCESS_RW, .pdo_mapping = 0, .flags = 0 }, { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("Node-ID of the SDO server"), #endif .subidx = 0x03, .type = CO_DEFTYPE_UNSIGNED8, #if !LELY_NO_CO_OBJ_LIMITS .min.u8 = CO_UNSIGNED8_MIN, .max.u8 = CO_UNSIGNED8_MAX, #endif #if !LELY_NO_CO_OBJ_DEFAULT .def.u8 = 0x02, #endif .val.u8 = 0x02, .access = CO_ACCESS_RW, .pdo_mapping = 0, .flags = 0 } }; /* Object 0x1400 sub-objects */ static const struct co_ssub g_1400_sub[] = { { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("Highest sub-index supported"), #endif .subidx = 0x00, .type = CO_DEFTYPE_UNSIGNED8, #if !LELY_NO_CO_OBJ_LIMITS .min.u8 = CO_UNSIGNED8_MIN, .max.u8 = CO_UNSIGNED8_MAX, #endif #if !LELY_NO_CO_OBJ_DEFAULT .def.u8 = 0x02, #endif .val.u8 = 0x02, .access = CO_ACCESS_CONST, .pdo_mapping = 0, .flags = 0 }, { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("COB-ID"), #endif .subidx = 0x01, .type = CO_DEFTYPE_UNSIGNED32, #if !LELY_NO_CO_OBJ_LIMITS .min.u32 = CO_UNSIGNED32_MIN, .max.u32 = CO_UNSIGNED32_MAX, #endif #if !LELY_NO_CO_OBJ_DEFAULT .def.u32 = 0x00000182lu, #endif .val.u32 = 0x00000182lu, .access = CO_ACCESS_RW, .pdo_mapping = 0, .flags = 0 }, { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("Transmission type"), #endif .subidx = 0x02, .type = CO_DEFTYPE_UNSIGNED8, #if !LELY_NO_CO_OBJ_LIMITS .min.u8 = CO_UNSIGNED8_MIN, .max.u8 = CO_UNSIGNED8_MAX, #endif #if !LELY_NO_CO_OBJ_DEFAULT .def.u8 = 0x01, #endif .val.u8 = 0x01, .access = CO_ACCESS_RW, .pdo_mapping = 0, .flags = 0 } }; /* Object 0x1600 sub-objects */ static const struct co_ssub g_1600_sub[] = { { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("Number of mapped objects"), #endif .subidx = 0x00, .type = CO_DEFTYPE_UNSIGNED8, #if !LELY_NO_CO_OBJ_LIMITS .min.u8 = CO_UNSIGNED8_MIN, .max.u8 = CO_UNSIGNED8_MAX, #endif #if !LELY_NO_CO_OBJ_DEFAULT .def.u8 = 0x01, #endif .val.u8 = 0x01, .access = CO_ACCESS_RW, .pdo_mapping = 0, .flags = 0 }, { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("Mapping 1"), #endif .subidx = 0x01, .type = CO_DEFTYPE_UNSIGNED32, #if !LELY_NO_CO_OBJ_LIMITS .min.u32 = CO_UNSIGNED32_MIN, .max.u32 = CO_UNSIGNED32_MAX, #endif #if !LELY_NO_CO_OBJ_DEFAULT .def.u32 = 0x21000020lu, #endif .val.u32 = 0x21000020lu, .access = CO_ACCESS_RW, .pdo_mapping = 0, .flags = 0 } }; /* Object 0x1f80 sub-objects */ static const struct co_ssub g_1f80_sub[] = { { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("NMT startup"), #endif .subidx = 0x00, .type = CO_DEFTYPE_UNSIGNED32, #if !LELY_NO_CO_OBJ_LIMITS .min.u32 = CO_UNSIGNED32_MIN, .max.u32 = CO_UNSIGNED32_MAX, #endif #if !LELY_NO_CO_OBJ_DEFAULT .def.u32 = CO_UNSIGNED32_MIN, #endif .val.u32 = 0x00000000lu, .access = CO_ACCESS_RW, .pdo_mapping = 0, .flags = 0 | CO_OBJ_FLAGS_PARAMETER_VALUE } }; /* Object 0x2000 sub-objects */ static const struct co_ssub g_2000_sub[] = { { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("Object with custom SDO download callback"), #endif .subidx = 0x00, .type = CO_DEFTYPE_UNSIGNED32, #if !LELY_NO_CO_OBJ_LIMITS .min.u32 = CO_UNSIGNED32_MIN, .max.u32 = CO_UNSIGNED32_MAX, #endif #if !LELY_NO_CO_OBJ_DEFAULT .def.u32 = CO_UNSIGNED32_MIN, #endif .val.u32 = CO_UNSIGNED32_MIN, .access = CO_ACCESS_RW, .pdo_mapping = 0, .flags = 0 } }; /* Object 0x2001 sub-objects */ static const struct co_ssub g_2001_sub[] = { { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("Object with custom SDO upload callback"), #endif .subidx = 0x00, .type = CO_DEFTYPE_UNSIGNED32, #if !LELY_NO_CO_OBJ_LIMITS .min.u32 = CO_UNSIGNED32_MIN, .max.u32 = CO_UNSIGNED32_MAX, #endif #if !LELY_NO_CO_OBJ_DEFAULT .def.u32 = CO_UNSIGNED32_MIN, #endif .val.u32 = CO_UNSIGNED32_MIN, .access = CO_ACCESS_RO, .pdo_mapping = 0, .flags = 0 } }; /* Object 0x2100 sub-objects */ static const struct co_ssub g_2100_sub[] = { { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("Counter"), #endif .subidx = 0x00, .type = CO_DEFTYPE_UNSIGNED32, #if !LELY_NO_CO_OBJ_LIMITS .min.u32 = CO_UNSIGNED32_MIN, .max.u32 = CO_UNSIGNED32_MAX, #endif #if !LELY_NO_CO_OBJ_DEFAULT .def.u32 = CO_UNSIGNED32_MIN, #endif .val.u32 = CO_UNSIGNED32_MIN, .access = CO_ACCESS_RW, .pdo_mapping = 1, .flags = 0 } }; /* Object dictionary */ static const struct co_sobj g_g_sdev_master_objs[] = { { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("Device type"), #endif .idx = 0x1000, .code = CO_OBJECT_VAR, .nsub = 1, .subs = g_1000_sub }, { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("Error register"), #endif .idx = 0x1001, .code = CO_OBJECT_VAR, .nsub = 1, .subs = g_1001_sub }, { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("COB-ID SYNC message"), #endif .idx = 0x1005, .code = CO_OBJECT_VAR, .nsub = 1, .subs = g_1005_sub }, { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("Communication cycle period"), #endif .idx = 0x1006, .code = CO_OBJECT_VAR, .nsub = 1, .subs = g_1006_sub }, { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("COB-ID time stamp object"), #endif .idx = 0x1012, .code = CO_OBJECT_VAR, .nsub = 1, .subs = g_1012_sub }, { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("Producer heartbeat time"), #endif .idx = 0x1017, .code = CO_OBJECT_VAR, .nsub = 1, .subs = g_1017_sub }, { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("Identity object"), #endif .idx = 0x1018, .code = CO_OBJECT_RECORD, .nsub = 5, .subs = g_1018_sub }, { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("SDO client parameter"), #endif .idx = 0x1280, .code = CO_OBJECT_RECORD, .nsub = 4, .subs = g_1280_sub }, { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("RPDO communication parameter"), #endif .idx = 0x1400, .code = CO_OBJECT_RECORD, .nsub = 3, .subs = g_1400_sub }, { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("RPDO mapping parameter"), #endif .idx = 0x1600, .code = CO_OBJECT_RECORD, .nsub = 2, .subs = g_1600_sub }, { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("NMT startup"), #endif .idx = 0x1f80, .code = CO_OBJECT_VAR, .nsub = 1, .subs = g_1f80_sub }, { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("Object with custom SDO download callback"), #endif .idx = 0x2000, .code = CO_OBJECT_VAR, .nsub = 1, .subs = g_2000_sub }, { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("Object with custom SDO upload callback"), #endif .idx = 0x2001, .code = CO_OBJECT_VAR, .nsub = 1, .subs = g_2001_sub }, { #if !LELY_NO_CO_OBJ_NAME .name = CO_SDEV_STRING("Counter"), #endif .idx = 0x2100, .code = CO_OBJECT_VAR, .nsub = 1, .subs = g_2100_sub } }; /**************************************************************************** * Public Data ****************************************************************************/ const struct co_sdev g_sdev_master = { .id = 0x01, .name = NULL, .vendor_name = CO_SDEV_STRING("Apache NuttX RTOS"), .vendor_id = 0x00000000, .product_name = NULL, .product_code = 0x00000000, .revision = 0x00000000, .order_code = NULL, .baud = CO_BAUD_125, .rate = 0, .lss = 0, .dummy = 0x000000fe, .nobj = 14, .objs = g_g_sdev_master_objs }; /**************************************************************************** * Public Functions ****************************************************************************/