Bugfix/zephyr build for minimal ram (#606)

* Removed BACnet objects from ports/zephyr. There should only be datalink and OS related interfaces in OS ports.

* Added Kconfig and bacnet-config.h options in ports/zephyr to keep small footprint for MCUs having less RAM

* Changed ports/zephry for BACnet/IP and date-time with latest zephyr OS
This commit is contained in:
Steve Karg
2024-03-26 14:21:30 -05:00
committed by GitHub
parent 80c51a06e3
commit a4910d4117
9 changed files with 369 additions and 4133 deletions
-1352
View File
File diff suppressed because it is too large Load Diff
-1451
View File
File diff suppressed because it is too large Load Diff
+36 -27
View File
@@ -1,28 +1,14 @@
/************************************************************************** /**
* * @file
* Copyright (c) 2024 Legrand North America, LLC. * @brief Port specific configuration for BACnet Stack for Zephyr OS
* * @author Steve Karg
* Permission is hereby granted, free of charge, to any person obtaining * @date 2024
* a copy of this software and associated documentation files (the * @section LICENSE
* "Software"), to deal in the Software without restriction, including *
* without limitation the rights to use, copy, modify, merge, publish, * Copyright (C) 2024 Steve Karg <skarg@users.sourceforge.net>
* distribute, sublicense, and/or sell copies of the Software, and to *
* permit persons to whom the Software is furnished to do so, subject to * SPDX-License-Identifier: MIT
* the following conditions: */
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
*********************************************************************/
#ifndef BACNET_PORTS_ZEPHYR_BACNET_CONFIG_H #ifndef BACNET_PORTS_ZEPHYR_BACNET_CONFIG_H
#define BACNET_PORTS_ZEPHYR_BACNET_CONFIG_H #define BACNET_PORTS_ZEPHYR_BACNET_CONFIG_H
@@ -30,6 +16,29 @@
#error bacnet-config.h included outside of BACNET_CONFIG_H control #error bacnet-config.h included outside of BACNET_CONFIG_H control
#endif #endif
#include <zephyr/sys/util.h> // Provides platform-specific defn of ARRAY_SIZE() /* provides platform specific define for ARRAY_SIZE */
#include <zephyr/sys/util.h>
#endif // BACNET_PORTS_ZEPHYR_BACNET_CONFIG_H /* some smaller defaults for microcontrollers */
#if !defined(MAX_TSM_TRANSACTIONS)
#define MAX_TSM_TRANSACTIONS 1
#endif
#if !defined(MAX_ADDRESS_CACHE)
#define MAX_ADDRESS_CACHE 1
#endif
#if !defined(MAX_CHARACTER_STRING_BYTES)
#define MAX_CHARACTER_STRING_BYTES 64
#endif
#if !defined(MAX_OCTET_STRING_BYTES)
#define MAX_OCTET_STRING_BYTES 64
#endif
/* K.6.6 BIBB - Network Management-BBMD Configuration-B (NM-BBMDC-B)*/
#if !defined(MAX_BBMD_ENTRIES)
#define MAX_BBMD_ENTRIES 5
#endif
#if !defined(MAX_FD_ENTRIES)
#define MAX_FD_ENTRIES 5
#endif
#endif
+98 -95
View File
@@ -71,22 +71,21 @@ static struct in_addr BIP_Broadcast_Addr;
/* Used by inet_ntoa */ /* Used by inet_ntoa */
#if CONFIG_BACNETSTACK_LOG_LEVEL #if CONFIG_BACNETSTACK_LOG_LEVEL
static char ipv4_addr_str[16]={0}; static char ipv4_addr_str[16] = { 0 };
#else #else
static char ipv4_addr_str[]=""; static char ipv4_addr_str[] = "";
#endif #endif
/** /**
* @brief Return a string representation of an IPv4 address * @brief Return a string representation of an IPv4 address
* @param a - IPv4 address * @param a - IPv4 address
* @return Pointer to global string * @return Pointer to global string
*/ */
char* inet_ntoa(struct in_addr *a) char *inet_ntoa(struct in_addr *a)
{ {
if (IS_ENABLED(CONFIG_BACNETSTACK_LOG_LEVEL)) { if (IS_ENABLED(CONFIG_BACNETSTACK_LOG_LEVEL)) {
snprintf(ipv4_addr_str, sizeof(ipv4_addr_str), "%d.%d.%d.%d", snprintf(ipv4_addr_str, sizeof(ipv4_addr_str), "%d.%d.%d.%d",
a->s4_addr[0],a->s4_addr[1],a->s4_addr[2],a->s4_addr[3]); a->s4_addr[0], a->s4_addr[1], a->s4_addr[2], a->s4_addr[3]);
} }
return &ipv4_addr_str[0]; return &ipv4_addr_str[0];
@@ -97,14 +96,15 @@ char* inet_ntoa(struct in_addr *a)
* @param str - debug info string * @param str - debug info string
* @param addr - IPv4 address * @param addr - IPv4 address
*/ */
static void debug_print_ipv4(const char *str, const struct in_addr *addr, static void debug_print_ipv4(const char *str,
const unsigned int port, const unsigned int count) const struct in_addr *addr,
const unsigned int port,
const unsigned int count)
{ {
LOG_DBG("%s %s:%hu (%u bytes)", log_strdup(str), log_strdup(inet_ntoa((struct in_addr*) &addr)), LOG_DBG("%s %s:%hu (%u bytes)", str, inet_ntoa((struct in_addr *)&addr),
ntohs(port), count); ntohs(port), count);
} }
/** /**
* @brief Set the BACnet IPv4 UDP port number * @brief Set the BACnet IPv4 UDP port number
* @param port - IPv4 UDP port number - in host byte order * @param port - IPv4 UDP port number - in host byte order
@@ -169,7 +169,6 @@ void bip_get_broadcast_address(BACNET_ADDRESS *dest)
return; return;
} }
/** /**
* Set the BACnet/IP address * Set the BACnet/IP address
* *
@@ -257,7 +256,7 @@ uint8_t bip_get_subnet_prefix(void)
if ((address | mask) == broadcast) { if ((address | mask) == broadcast) {
break; break;
} }
mask = mask<<1; mask = mask << 1;
} }
return prefix; return prefix;
@@ -290,8 +289,8 @@ int bip_send_mpdu(BACNET_IP_ADDRESS *dest, uint8_t *mtu, uint16_t mtu_len)
bip_dest.sin_port = htons(dest->port); bip_dest.sin_port = htons(dest->port);
/* Send the packet */ /* Send the packet */
debug_print_ipv4("Sending MPDU->", &bip_dest.sin_addr, bip_dest.sin_port, debug_print_ipv4(
mtu_len); "Sending MPDU->", &bip_dest.sin_addr, bip_dest.sin_port, mtu_len);
return zsock_sendto(BIP_Socket, (char *)mtu, mtu_len, 0, return zsock_sendto(BIP_Socket, (char *)mtu, mtu_len, 0,
(struct sockaddr *)&bip_dest, sizeof(struct sockaddr)); (struct sockaddr *)&bip_dest, sizeof(struct sockaddr));
} }
@@ -345,19 +344,18 @@ uint16_t bip_receive(
/* see if there is a packet for us */ /* see if there is a packet for us */
if (zsock_select(max + 1, &read_fds, NULL, NULL, &select_timeout) > 0) { if (zsock_select(max + 1, &read_fds, NULL, NULL, &select_timeout) > 0) {
socket = FD_ISSET(BIP_Socket, &read_fds) ? BIP_Socket : socket =
BIP_Broadcast_Socket; FD_ISSET(BIP_Socket, &read_fds) ? BIP_Socket : BIP_Broadcast_Socket;
received_bytes = zsock_recvfrom(socket, (char *)&npdu[0], max_npdu, received_bytes = zsock_recvfrom(socket, (char *)&npdu[0], max_npdu, 0,
0, (struct sockaddr *)&sin, &sin_len); (struct sockaddr *)&sin, &sin_len);
} } else {
else
{
return 0; return 0;
} }
/* See if there is a problem */ /* See if there is a problem */
if (received_bytes < 0) { if (received_bytes < 0) {
LOG_WRN("%s:%d - RX zsock_recvfrom() error: %d", THIS_FILE, __LINE__, received_bytes); LOG_WRN("%s:%d - RX zsock_recvfrom() error: %d", THIS_FILE, __LINE__,
received_bytes);
return 0; return 0;
} }
/* no problem, just no bytes */ /* no problem, just no bytes */
@@ -379,16 +377,16 @@ uint16_t bip_receive(
memcpy(&addr.address[0], &sin.sin_addr.s_addr, IP_ADDRESS_MAX); memcpy(&addr.address[0], &sin.sin_addr.s_addr, IP_ADDRESS_MAX);
addr.port = ntohs(sin.sin_port); addr.port = ntohs(sin.sin_port);
debug_print_ipv4("Received MPDU->", &sin.sin_addr, sin.sin_port, debug_print_ipv4(
received_bytes); "Received MPDU->", &sin.sin_addr, sin.sin_port, received_bytes);
/* pass the packet into the BBMD handler */ /* pass the packet into the BBMD handler */
offset = socket == BIP_Socket ? offset = socket == BIP_Socket
bvlc_handler(&addr, src, npdu, received_bytes) : ? bvlc_handler(&addr, src, npdu, received_bytes)
bvlc_broadcast_handler(&addr, src, npdu, received_bytes); : bvlc_broadcast_handler(&addr, src, npdu, received_bytes);
if (offset > 0) { if (offset > 0) {
npdu_len = received_bytes - offset; npdu_len = received_bytes - offset;
debug_print_ipv4("Received NPDU->", &sin.sin_addr, sin.sin_port, debug_print_ipv4(
npdu_len); "Received NPDU->", &sin.sin_addr, sin.sin_port, npdu_len);
if (npdu_len <= max_npdu) { if (npdu_len <= max_npdu) {
/* shift the buffer to return a valid NPDU */ /* shift the buffer to return a valid NPDU */
for (i = 0; i < npdu_len; i++) { for (i = 0; i < npdu_len; i++) {
@@ -432,81 +430,89 @@ int bip_send_pdu(BACNET_ADDRESS *dest,
*/ */
void bip_set_interface(char *ifname) void bip_set_interface(char *ifname)
{ {
struct net_if *interface = 0; struct net_if *iface = 0;
int index = -1; int index = -1;
uint8_t x=0; uint8_t x = 0;
BACNET_IP_ADDRESS unicast = { 0 };
BACNET_IP_ADDRESS unicast = {0}; BACNET_IP_ADDRESS broadcast = { 0 };
BACNET_IP_ADDRESS broadcast = {0};
/* Network byte order */ /* Network byte order */
unicast.port = BIP_Port; unicast.port = BIP_Port;
broadcast.port = BIP_Port; broadcast.port = BIP_Port;
LOG_INF("bip_set_interface()"); LOG_INF("bip_set_interface()");
LOG_INF("UDP port: %d", ntohs(BIP_Port)); LOG_INF("UDP port: %d", ntohs(BIP_Port));
if(ifname) if (ifname) {
{
index = atoi(ifname); index = atoi(ifname);
/* if index is zero, discern between "0" and a parse error */ /* if index is zero, discern between "0" and a parse error */
if(!index && strcmp(ifname,"0")) if (!index && strcmp(ifname, "0")) {
{ LOG_ERR("%s:%d - Argument must parse to an integer", THIS_FILE,
LOG_ERR("%s:%d - Argument must parse to an integer", THIS_FILE, __LINE__); __LINE__);
} } else {
else iface = net_if_get_by_index(index);
{ if (iface) {
interface = net_if_get_by_index(index); LOG_INF("Using iface %d", index);
if(interface) } else {
{ LOG_ERR(
LOG_INF("Using interface %d", index); "%s:%d - No iface at index %d", THIS_FILE, __LINE__, index);
}
else
{
LOG_ERR("%s:%d - No interface at index %d", THIS_FILE, __LINE__, index);
} }
} }
} }
if (index == -1) {
if(index == -1) LOG_WRN("%s:%d - No valid interface specified - using default ",
{ THIS_FILE, __LINE__);
LOG_WRN("%s:%d - No valid interface specified - using default ",THIS_FILE, __LINE__); iface = net_if_get_default();
interface = net_if_get_default();
} }
if (iface) {
LOG_INF("Interface set.");
#if defined(CONFIG_BACDL_BIP_ADDRESS_INDEX)
LOG_INF("Config unicast address %d/%d",
CONFIG_BACDL_BIP_ADDRESS_INDEX, NET_IF_MAX_IPV4_ADDR);
index = CONFIG_BACDL_BIP_ADDRESS_INDEX;
#else
int i;
char hr_addr[NET_IPV4_ADDR_LEN];
index = 0;
for (i = 0; i < NET_IF_MAX_IPV4_ADDR; i++) {
struct net_if_addr *if_addr = &iface->config.ip.ipv4->unicast[i];
if(interface) if (!if_addr->is_used) {
{ continue;
LOG_INF("Interface set"); }
index = i;
if(CONFIG_BACDL_BIP_ADDRESS_INDEX >= NET_IF_MAX_IPV4_ADDR) LOG_INF("IPv4 address: %s",
{ net_addr_ntop(AF_INET, &if_addr->address.in_addr, hr_addr,
LOG_ERR("%s:%d - IPv4 address index of %d is out of range (0-%d)",THIS_FILE, __LINE__, CONFIG_BACDL_BIP_ADDRESS_INDEX, NET_IF_MAX_IPV4_ADDR-1); NET_IPV4_ADDR_LEN));
LOG_INF("Subnet: %s",
net_addr_ntop(AF_INET, &iface->config.ip.ipv4->netmask, hr_addr,
NET_IPV4_ADDR_LEN));
LOG_INF("Router: %s",
net_addr_ntop(AF_INET, &iface->config.ip.ipv4->gw, hr_addr,
NET_IPV4_ADDR_LEN));
break;
}
#endif
if (index >= NET_IF_MAX_IPV4_ADDR) {
LOG_ERR("%s:%d - IPv4 address index of %d is out of range (0-%d)",
THIS_FILE, __LINE__, index, NET_IF_MAX_IPV4_ADDR - 1);
return; return;
} }
LOG_INF("Using IPv4 address at index %d", index);
LOG_INF("Using IPv4 address at index %d", CONFIG_BACDL_BIP_ADDRESS_INDEX);
/* Build the broadcast address from the unicast and netmask */ /* Build the broadcast address from the unicast and netmask */
for(x=0; x<IP_ADDRESS_MAX; x++) struct net_if_addr *if_addr = &iface->config.ip.ipv4->unicast[index];
{ for (x = 0; x < IP_ADDRESS_MAX; x++) {
broadcast.address[x] = interface->config.ip.ipv4->unicast[CONFIG_BACDL_BIP_ADDRESS_INDEX].address.in_addr.s4_addr[x] | unicast.address[x] = if_addr->address.in_addr.s4_addr[x];
~interface->config.ip.ipv4->netmask.s4_addr[x]; broadcast.address[x] = if_addr->address.in_addr.s4_addr[x] |
~iface->config.ip.ipv4->netmask.s4_addr[x];
unicast.address[x] = interface->config.ip.ipv4->unicast[CONFIG_BACDL_BIP_ADDRESS_INDEX].address.in_addr.s4_addr[x];
} }
bip_set_addr(&unicast); bip_set_addr(&unicast);
bip_set_broadcast_addr(&broadcast); bip_set_broadcast_addr(&broadcast);
LOG_INF("BACnet/IP Unicast: %u.%u.%u.%u", unicast.address[0],
/* net_if -> net_if_config . net_if_ip . net_if_ipv4 -> net_if_addr . net_addr . in_addr . s4_addr[4] */ unicast.address[1], unicast.address[2], unicast.address[3]);
LOG_INF(" Unicast: %s", log_strdup(inet_ntoa(&interface->config.ip.ipv4->unicast->address.in_addr))); LOG_INF("BACnet/IP Broadcast: %u.%u.%u.%u", broadcast.address[0],
LOG_INF(" Broadcast: %s", log_strdup(inet_ntoa(&BIP_Broadcast_Addr))); broadcast.address[1], broadcast.address[2], broadcast.address[3]);
LOG_INF(" Netmask: %s", log_strdup(inet_ntoa(&interface->config.ip.ipv4->netmask)) ); } else {
} LOG_ERR("%s:%d - Failed to set iface", THIS_FILE, __LINE__);
else
{
LOG_ERR("%s:%d - Failed to set interface", THIS_FILE, __LINE__);
} }
} }
@@ -521,9 +527,7 @@ static int createSocket(struct sockaddr_in *sin)
if (sock_fd < 0) { if (sock_fd < 0) {
LOG_ERR("%s:%d - Failed to create socket", THIS_FILE, __LINE__); LOG_ERR("%s:%d - Failed to create socket", THIS_FILE, __LINE__);
return sock_fd; return sock_fd;
} } else {
else
{
LOG_DBG("Socket created"); LOG_DBG("Socket created");
} }
@@ -537,15 +541,13 @@ static int createSocket(struct sockaddr_in *sin)
} }
/* bind the socket to the local port number and IP address */ /* bind the socket to the local port number and IP address */
status = status = zsock_bind(
zsock_bind(sock_fd, (const struct sockaddr *)sin, sizeof(struct sockaddr)); sock_fd, (const struct sockaddr *)sin, sizeof(struct sockaddr));
if (status < 0) { if (status < 0) {
zsock_close(sock_fd); zsock_close(sock_fd);
LOG_ERR("%s:%d - zsock_bind() failure", THIS_FILE, __LINE__); LOG_ERR("%s:%d - zsock_bind() failure", THIS_FILE, __LINE__);
return status; return status;
} } else {
else
{
LOG_DBG("Socket bound"); LOG_DBG("Socket bound");
} }
@@ -577,7 +579,8 @@ bool bip_init(char *ifname)
bip_set_interface(ifname); bip_set_interface(ifname);
if (BIP_Address.s_addr == 0) { if (BIP_Address.s_addr == 0) {
LOG_ERR("%s:%d - Failed to get an IP address on interface: %s\n", THIS_FILE, __LINE__, log_strdup(ifname ? ifname : "[default]")); LOG_ERR("%s:%d - Failed to get an IP address on interface: %s\n",
THIS_FILE, __LINE__, ifname ? ifname : "[default]");
return false; return false;
} }
+1 -7
View File
@@ -12,14 +12,8 @@
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#if CONFIG_NATIVE_APPLICATION
#include <sys/time.h>
#elif defined(__ZEPHYR__)
#include <zephyr/posix/sys/time.h>
#else
#include <posix/sys/time.h>
#endif
#include <time.h> #include <time.h>
#include <sys/time.h>
#include "bacnet/datetime.h" #include "bacnet/datetime.h"
-1138
View File
File diff suppressed because it is too large Load Diff
+11 -24
View File
@@ -1,27 +1,14 @@
/************************************************************************** /**
* * @file
* Copyright (C) 2004 Steve Karg <skarg@users.sourceforge.net> * @brief Default configuration for BACnet Stack library
* * @author Steve Karg <skarg@users.sourceforge.net>
* Permission is hereby granted, free of charge, to any person obtaining * @date 2004
* a copy of this software and associated documentation files (the * @section LICENSE
* "Software"), to deal in the Software without restriction, including *
* without limitation the rights to use, copy, modify, merge, publish, * Copyright (C) 2004 Steve Karg <skarg@users.sourceforge.net>
* distribute, sublicense, and/or sell copies of the Software, and to *
* permit persons to whom the Software is furnished to do so, subject to * SPDX-License-Identifier: MIT
* the following conditions: */
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
*********************************************************************/
#ifndef CONFIG_H #ifndef CONFIG_H
#define CONFIG_H #define CONFIG_H
+37 -39
View File
@@ -332,43 +332,43 @@ set(BACNETSTACK_BASIC_SRCS
$<$<BOOL:${CONFIG_BACDL_BIP6}>:${BACNETSTACK_SRC}/bacnet/basic/bbmd6/h_bbmd6.c> $<$<BOOL:${CONFIG_BACDL_BIP6}>:${BACNETSTACK_SRC}/bacnet/basic/bbmd6/h_bbmd6.c>
$<$<BOOL:${CONFIG_BACDL_BIP6}>:${BACNETSTACK_SRC}/bacnet/basic/bbmd6/vmac.c> $<$<BOOL:${CONFIG_BACDL_BIP6}>:${BACNETSTACK_SRC}/bacnet/basic/bbmd6/vmac.c>
${BACNETSTACK_SRC}/bacnet/basic/npdu/s_router.c ${BACNETSTACK_SRC}/bacnet/basic/npdu/s_router.c
${BACNETSTACK_SRC}/bacnet/basic/object/access_credential.c $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECTS_ACCESS}>:${BACNETSTACK_SRC}/bacnet/basic/object/access_credential.c>
${BACNETSTACK_SRC}/bacnet/basic/object/access_door.c $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECTS_ACCESS}>:${BACNETSTACK_SRC}/bacnet/basic/object/access_door.c>
${BACNETSTACK_SRC}/bacnet/basic/object/access_point.c $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECTS_ACCESS}>:${BACNETSTACK_SRC}/bacnet/basic/object/access_point.c>
${BACNETSTACK_SRC}/bacnet/basic/object/access_rights.c $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECTS_ACCESS}>:${BACNETSTACK_SRC}/bacnet/basic/object/access_rights.c>
${BACNETSTACK_SRC}/bacnet/basic/object/access_user.c $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECTS_ACCESS}>:${BACNETSTACK_SRC}/bacnet/basic/object/access_user.c>
${BACNETSTACK_SRC}/bacnet/basic/object/access_zone.c $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECTS_ACCESS}>:${BACNETSTACK_SRC}/bacnet/basic/object/access_zone.c>
${BACNETSTACK_SRC}/bacnet/basic/object/acc.c $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECT_ACCUMULATOR}>:${BACNETSTACK_SRC}/bacnet/basic/object/acc.c>
${BACNETSTACK_SRC}/bacnet/basic/object/ao.c $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECT_ANALOG_OUTPUT}>:${BACNETSTACK_SRC}/bacnet/basic/object/ao.c>
${BACNETSTACK_SRC}/bacnet/basic/object/bacfile.c $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECT_FILE}>:${BACNETSTACK_SRC}/bacnet/basic/object/bacfile.c>
${BACNETSTACK_SRC}/bacnet/basic/object/bi.c $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECT_BINARY_INPUT}>:${BACNETSTACK_SRC}/bacnet/basic/object/bi.c>
${BACNETSTACK_SRC}/bacnet/basic/object/bo.c $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECT_BINARY_OUTPUT}>:${BACNETSTACK_SRC}/bacnet/basic/object/bo.c>
${BACNETSTACK_SRC}/bacnet/basic/object/bv.c $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECT_BINARY_VALUE}>:${BACNETSTACK_SRC}/bacnet/basic/object/bv.c>
${BACNETSTACK_SRC}/bacnet/basic/object/calendar.c $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECT_CALENDAR}>:${BACNETSTACK_SRC}/bacnet/basic/object/calendar.c>
${BACNETSTACK_SRC}/bacnet/basic/object/channel.c $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECT_CHANNEL}>:${BACNETSTACK_SRC}/bacnet/basic/object/channel.c>
#${BACNETSTACK_SRC}/bacnet/basic/object/client/device-client.c $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECT_COMMAND}>:${BACNETSTACK_SRC}/bacnet/basic/object/command.c>
${BACNETSTACK_SRC}/bacnet/basic/object/command.c $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECT_COLOR}>:${BACNETSTACK_SRC}/bacnet/basic/object/color_object.c>
${BACNETSTACK_SRC}/bacnet/basic/object/color_object.c $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECT_COLOR_TEMPERATURE}>:${BACNETSTACK_SRC}/bacnet/basic/object/color_temperature.c>
${BACNETSTACK_SRC}/bacnet/basic/object/color_temperature.c $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECTS_ACCESS}>:${BACNETSTACK_SRC}/bacnet/basic/object/credential_data_input.c>
${BACNETSTACK_SRC}/bacnet/basic/object/credential_data_input.c $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECT_CHARACTERSTRING_VALUE}>:${BACNETSTACK_SRC}/bacnet/basic/object/csv.c>
${BACNETSTACK_SRC}/bacnet/basic/object/csv.c $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECT_DEVICE_CLIENT}>:${BACNETSTACK_SRC}/bacnet/basic/object/client/device-client.c>
${BACNETSTACK_SRC}/bacnet/basic/object/device.c $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECT_DEVICE_SERVER}>:${BACNETSTACK_SRC}/bacnet/basic/object/device.c>
$<$<BOOL:${CONFIG_BAC_ROUTING}>:${BACNETSTACK_SRC}/bacnet/basic/object/gateway/gw_device.c> $<$<BOOL:${CONFIG_BAC_ROUTING}>:${BACNETSTACK_SRC}/bacnet/basic/object/gateway/gw_device.c>
${BACNETSTACK_SRC}/bacnet/basic/object/iv.c $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECT_INTEGER_VALUE}>:${BACNETSTACK_SRC}/bacnet/basic/object/iv.c>
${BACNETSTACK_SRC}/bacnet/basic/object/lc.c $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECT_LOAD_CONTROL}>:${BACNETSTACK_SRC}/bacnet/basic/object/lc.c>
${BACNETSTACK_SRC}/bacnet/basic/object/lo.c $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECT_LIGHTING_OUTPUT}>:${BACNETSTACK_SRC}/bacnet/basic/object/lo.c>
${BACNETSTACK_SRC}/bacnet/basic/object/lsp.c $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECT_LIFE_SAFETY_POINT}>:${BACNETSTACK_SRC}/bacnet/basic/object/lsp.c>
${BACNETSTACK_SRC}/bacnet/basic/object/ms-input.c $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECT_MULTISTATE_INPUT}>:${BACNETSTACK_SRC}/bacnet/basic/object/ms-input.c>
${BACNETSTACK_SRC}/bacnet/basic/object/mso.c $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECT_MULTISTATE_OUTPUT}>:${BACNETSTACK_SRC}/bacnet/basic/object/mso.c>
${BACNETSTACK_SRC}/bacnet/basic/object/msv.c $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECT_MULTISTATE_VALUE}>:${BACNETSTACK_SRC}/bacnet/basic/object/msv.c>
${BACNETSTACK_SRC}/bacnet/basic/object/nc.c $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECT_NOTIFICATION_CLASS}>:${BACNETSTACK_SRC}/bacnet/basic/object/nc.c>
$<$<BOOL:${CONFIG_BACDL_BIP}>:${BACNETSTACK_SRC}/bacnet/basic/object/netport.c> $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECT_NETWORK_PORT}>:${BACNETSTACK_SRC}/bacnet/basic/object/netport.c>
${BACNETSTACK_SRC}/bacnet/basic/object/objects.c $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECTS}>:${BACNETSTACK_SRC}/bacnet/basic/object/objects.c>
${BACNETSTACK_SRC}/bacnet/basic/object/osv.c $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECT_OCTET_STRING_VALUE}>:${BACNETSTACK_SRC}/bacnet/basic/object/osv.c>
${BACNETSTACK_SRC}/bacnet/basic/object/piv.c $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECT_POSITIVE_INTEGER_VALUE}>:${BACNETSTACK_SRC}/bacnet/basic/object/piv.c>
${BACNETSTACK_SRC}/bacnet/basic/object/schedule.c $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECT_SCHEDULE}>:${BACNETSTACK_SRC}/bacnet/basic/object/schedule.c>
${BACNETSTACK_SRC}/bacnet/basic/object/time_value.c $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECT_TIME_VALUE}>:${BACNETSTACK_SRC}/bacnet/basic/object/time_value.c>
${BACNETSTACK_SRC}/bacnet/basic/object/trendlog.c $<$<BOOL:${CONFIG_BACNET_BASIC_OBJECT_TRENDLOG}>:${BACNETSTACK_SRC}/bacnet/basic/object/trendlog.c>
${BACNETSTACK_SRC}/bacnet/basic/service/h_alarm_ack.c ${BACNETSTACK_SRC}/bacnet/basic/service/h_alarm_ack.c
${BACNETSTACK_SRC}/bacnet/basic/service/h_arf_a.c ${BACNETSTACK_SRC}/bacnet/basic/service/h_arf_a.c
${BACNETSTACK_SRC}/bacnet/basic/service/h_arf.c ${BACNETSTACK_SRC}/bacnet/basic/service/h_arf.c
@@ -428,9 +428,6 @@ list(
$<$<BOOL:${CONFIG_BACDL_ETHERNET}>:${BACNETSTACK_PORT}/ethernet.c> $<$<BOOL:${CONFIG_BACDL_ETHERNET}>:${BACNETSTACK_PORT}/ethernet.c>
${BACNETSTACK_PORT}/main.c ${BACNETSTACK_PORT}/main.c
${BACNETSTACK_PORT}/mstimer-init.c ${BACNETSTACK_PORT}/mstimer-init.c
${BACNETSTACK_PORT}/ai.c
${BACNETSTACK_PORT}/av.c
${BACNETSTACK_PORT}/event.c
) )
@@ -450,6 +447,7 @@ zephyr_library_compile_definitions(
$<$<BOOL:${CONFIG_BACDL_MSTP}>:BACDL_MSTP> $<$<BOOL:${CONFIG_BACDL_MSTP}>:BACDL_MSTP>
$<$<BOOL:${CONFIG_BACDL_ETHERNET}>:BACDL_ETHERNET> $<$<BOOL:${CONFIG_BACDL_ETHERNET}>:BACDL_ETHERNET>
$<$<BOOL:${CONFIG_BACDL_NONE}>:BACDL_NONE> $<$<BOOL:${CONFIG_BACDL_NONE}>:BACDL_NONE>
$<$<BOOL:${CONFIG_BACNET_BASIC_OBJECTS}>:BACNET_BASIC_OBJECTS>
$<$<BOOL:${CONFIG_BACNET_PROPERTY_LISTS}>:BACNET_PROPERTY_LISTS=1> $<$<BOOL:${CONFIG_BACNET_PROPERTY_LISTS}>:BACNET_PROPERTY_LISTS=1>
$<$<BOOL:${CONFIG_BACNET_ROUTING}>:BACNET_ROUTING> $<$<BOOL:${CONFIG_BACNET_ROUTING}>:BACNET_ROUTING>
$<$<BOOL:${CONFIG_BACAPP_PRINT_ENABLED}>:BACAPP_PRINT_ENABLED=1> $<$<BOOL:${CONFIG_BACAPP_PRINT_ENABLED}>:BACAPP_PRINT_ENABLED=1>
+186
View File
@@ -112,6 +112,192 @@ config BACNET_USE_SECTION_ITERABLE_OBJECT_TABLE
help help
Use the Section Iterable for the Object Table Use the Section Iterable for the Object Table
config BACNET_BASIC_OBJECTS_ACCESS
bool "Use the BACnet basic access control objects"
default false
help
Use the BACnet basic access control objects
config BACNET_BASIC_OBJECT_ACCUMULATOR
bool "Use the BACnet basic accumulator object"
default false
help
Use the BACnet basic accumulator object
config BACNET_BASIC_OBJECT_ANALOG_INPUT
bool "Use the BACnet basic analog input object"
default false
help
Use the BACnet basic analog input object
config BACNET_BASIC_OBJECT_ANALOG_OUTPUT
bool "Use the BACnet basic analog output object"
default false
help
Use the BACnet basic analog output object
config BACNET_BASIC_OBJECT_ANALOG_VALUE
bool "Use the BACnet basic analog value object"
default false
help
Use the BACnet basic analog value object
config BACNET_BASIC_OBJECT_FILE
bool "Use the BACnet basic file object"
default false
help
Use the BACnet basic file object
config BACNET_BASIC_OBJECT_BINARY_INPUT
bool "Use the BACnet basic binary input object"
default false
help
Use the BACnet basic binary input object
config BACNET_BASIC_OBJECT_BINARY_OUTPUT
bool "Use the BACnet basic binary output object"
default false
help
Use the BACnet basic binary output object
config BACNET_BASIC_OBJECT_BINARY_VALUE
bool "Use the BACnet basic binary value object"
default false
help
Use the BACnet basic binary value object
config BACNET_BASIC_OBJECT_CALENDAR
bool "Use the BACnet basic calendar object"
default false
help
Use the BACnet basic calendar object
config BACNET_BASIC_OBJECT_CHANNEL
bool "Use the BACnet basic channel object"
default false
help
Use the BACnet basic channel object
config BACNET_BASIC_OBJECT_COMMAND
bool "Use the BACnet basic command object"
default false
help
Use the BACnet basic command object
config BACNET_BASIC_OBJECT_COLOR
bool "Use the BACnet basic color object"
default false
help
Use the BACnet basic color object
config BACNET_BASIC_OBJECT_COLOR_TEMPERATURE
bool "Use the BACnet basic color temperature object"
default false
help
Use the BACnet basic color temperature object
config BACNET_BASIC_OBJECT_CHARACTERSTRING_VALUE
bool "Use the BACnet basic character-string value object"
default false
help
Use the BACnet basic character-string value object
config BACNET_BASIC_OBJECT_DEVICE_SERVER
bool "Use the BACnet basic device-server object"
default false
help
Use the BACnet basic device-server object
config BACNET_BASIC_OBJECT_DEVICE_CLIENT
bool "Use the BACnet basic device-client object"
default false
help
Use the BACnet basic device-server object
config BACNET_BASIC_OBJECT_INTEGER_VALUE
bool "Use the BACnet basic integer value object"
default false
help
Use the BACnet basic integer value object
config BACNET_BASIC_OBJECT_LOAD_CONTROL
bool "Use the BACnet basic load control object"
default false
help
Use the BACnet basic load control object
config BACNET_BASIC_OBJECT_LIGHTING_OUTPUT
bool "Use the BACnet basic lighting output object"
default false
help
Use the BACnet basic lighting output object
config BACNET_BASIC_OBJECT_LIFE_SAFETY_POINT
bool "Use the BACnet basic life-safety point object"
default false
help
Use the BACnet basic life-safety point object
config BACNET_BASIC_OBJECT_MULTISTATE_INPUT
bool "Use the BACnet basic multistate input object"
default false
help
Use the BACnet basic multistate input object
config BACNET_BASIC_OBJECT_MULTISTATE_OUTPUT
bool "Use the BACnet basic multistate output object"
default false
help
Use the BACnet basic multistate output object
config BACNET_BASIC_OBJECT_MULTISTATE_VALUE
bool "Use the BACnet basic multistate value object"
default false
help
Use the BACnet basic multistate value object
config BACNET_BASIC_OBJECT_NOTIFICATION_CLASS
bool "Use the BACnet basic notification class object"
default false
help
Use the BACnet basic notification class object
config BACNET_BASIC_OBJECT_NETWORK_PORT
bool "Use the BACnet basic network port object"
default false
help
Use the BACnet basic network port object
config BACNET_BASIC_OBJECT_OCTET_STRING_VALUE
bool "Use the BACnet basic octet-string value object"
default false
help
Use the BACnet basic octet-string value object
config BACNET_BASIC_OBJECT_POSITIVE_INTEGER_VALUE
bool "Use the BACnet basic positive-integer value object"
default false
help
Use the BACnet basic positive-integer value object
config CONFIG_BACNET_BASIC_OBJECT_SCHEDULE
bool "Use the BACnet basic schedule object"
default false
help
Use the BACnet basic schedule object
config CONFIG_BACNET_BASIC_OBJECT_TIME_VALUE
bool "Use the BACnet basic time value object"
default false
help
Use the BACnet basic time value object
config CONFIG_BACNET_BASIC_OBJECT_TRENDLOG
bool "Use the BACnet basic trendlog object"
default false
help
Use the BACnet basic trendlog object
rsource "subsys/Kconfig" rsource "subsys/Kconfig"
endif # BACNETSTACK endif # BACNETSTACK