Skip to content

Commit f14b88d

Browse files
committed
Added BACnet Smart Actuator (B-SA) device profile sample
1 parent 0af133e commit f14b88d

File tree

5 files changed

+292
-0
lines changed

5 files changed

+292
-0
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# SPDX-License-Identifier: MIT
2+
3+
cmake_minimum_required(VERSION 3.13.1)
4+
5+
get_filename_component(MY_PROJECT_NAME ${CMAKE_CURRENT_SOURCE_DIR} NAME)
6+
7+
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
8+
project(${MY_PROJECT_NAME})
9+
10+
target_sources(app PRIVATE src/main.c)
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
.. _b-ss_sample:
2+
3+
BACnet Profile B-SA Sample
4+
##########################
5+
6+
Overview
7+
********
8+
9+
This is a simple application demonstrating configuration of a
10+
BACnet Smart Actuator (B-SA) device profile.
11+
12+
Requirements
13+
************
14+
15+
* A board with Ethernet support, for instance: nucleo_f429zi
16+
17+
Building and Running
18+
********************
19+
20+
This sample can be found under :bacnet_file:`samples/profiles/b-ss` in
21+
the BACnet tree.
22+
23+
The sample can be built for several platforms.
24+
25+
Compile this sample for the `nucleo_f429zi` board:
26+
27+
west build -b nucleo_f429zi -p always bacnet/zephyr/samples/profiles/b-sa/
28+
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
# General config
2+
#CONFIG_ASSERT=y
3+
#CONFIG_ASSERT_LEVEL=2
4+
#CONFIG_ASSERT_VERBOSE=y
5+
6+
# Compiler library config
7+
#CONFIG_PICOLIBC=y
8+
#CONFIG_PICOLIBC_USE_MODULE=y
9+
#CONFIG_REQUIRES_FULL_LIBC=y
10+
#CONFIG_MINIMAL_LIBC=y
11+
12+
# system
13+
# some heap is needed for the shell
14+
CONFIG_HEAP_MEM_POOL_SIZE=2048
15+
CONFIG_KERNEL_MEM_POOL=y
16+
CONFIG_MAIN_THREAD_PRIORITY=7
17+
#CONFIG_PICOLIBC=y
18+
CONFIG_ISR_STACK_SIZE=8192
19+
CONFIG_MAIN_STACK_SIZE=8192
20+
CONFIG_IDLE_STACK_SIZE=2048
21+
CONFIG_INIT_STACKS=y
22+
23+
# BACnet Library
24+
CONFIG_BACNETSTACK=y
25+
CONFIG_BACNETSTACK_LOG_LEVEL=3
26+
CONFIG_BACNETSTACK_BACNET_BASIC=y
27+
# BACnet Library - options
28+
CONFIG_BACNET_MAX_CHARACTER_STRING_BYTES=128
29+
CONFIG_BACAPP_MINIMAL=y
30+
CONFIG_BACAPP_HOST_N_PORT=y
31+
# BACnet Library - objects
32+
CONFIG_BACNET_BASIC_OBJECT_NETWORK_PORT=y
33+
CONFIG_BACNET_BASIC_OBJECT_ANALOG_OUTPUT=y
34+
# BACnet Library - shell
35+
CONFIG_BACNET_BASIC_DEVICE_SHELL=y
36+
# BACnet settings subsystem
37+
#CONFIG_BACNETSTACK_BACNET_SETTINGS=y
38+
#CONFIG_BACNET_SETTINGS=y
39+
#CONFIG_BACNET_SETTINGS_SHELL=y
40+
41+
# BACnet Datalink Options
42+
CONFIG_BACDL_BIP=y
43+
CONFIG_BACDL_BIP_PORT=47808
44+
CONFIG_BACDL_BIP_ADDRESS_INDEX=0
45+
46+
# networking
47+
CONFIG_NETWORKING=y
48+
#CONFIG_NET_ARP=y
49+
#CONFIG_NET_TCP=y
50+
CONFIG_NET_UDP=y
51+
CONFIG_NET_SHELL=y
52+
CONFIG_NET_SOCKETS=y
53+
# Dynamic IP address
54+
#CONFIG_NET_DHCPV4=y
55+
#CONFIG_NET_IPV4_AUTO=y
56+
#CONFIG_NET_IF_UNICAST_IPV4_ADDR_COUNT=2
57+
# Static IP address pre-configuration
58+
CONFIG_NET_CONFIG_SETTINGS=y
59+
CONFIG_NET_CONFIG_MY_IPV4_ADDR="192.0.2.1"
60+
CONFIG_NET_CONFIG_MY_IPV4_NETMASK="255.255.255.0"
61+
CONFIG_NET_CONFIG_MY_IPV4_GW="192.0.2.2"
62+
# Network debug config
63+
CONFIG_NET_LOG=y
64+
CONFIG_NET_SHELL=y
65+
66+
#CONFIG_DNS_RESOLVER=y
67+
#CONFIG_SLIP_STATISTICS=n
68+
69+
CONFIG_NET_TX_STACK_SIZE=8192
70+
CONFIG_NET_RX_STACK_SIZE=8192
71+
72+
# Enable Shell, Console, and Logging features
73+
CONFIG_CONSOLE=y
74+
CONFIG_PRINTK=y
75+
CONFIG_SHELL=y
76+
CONFIG_KERNEL_SHELL=y
77+
CONFIG_THREAD_MONITOR=y
78+
#CONFIG_BOOT_BANNER=n
79+
CONFIG_THREAD_NAME=y
80+
CONFIG_DEVICE_SHELL=y
81+
#CONFIG_POSIX_CLOCK=y
82+
#CONFIG_DATE_SHELL=y
83+
CONFIG_LOG=y
84+
CONFIG_LOG_BACKEND_UART=y
85+
CONFIG_SHELL_LOG_BACKEND=n
86+
#CONFIG_LOG_STRDUP_BUF_COUNT=4
87+
#CONFIG_LOG_STRDUP_MAX_STRING=96
88+
#CONFIG_NET_CONN_LOG_LEVEL_DEFAULT=n
89+
#CONFIG_NET_CONN_LOG_LEVEL_DBG=y
90+
#CONFIG_NET_IF_LOG_LEVEL_DEFAULT=n
91+
CONFIG_NET_IF_LOG_LEVEL_DBG=n
92+
CONFIG_NET_LOG=y
93+
94+
# enable the thread, stack, and runtime stats
95+
CONFIG_THREAD_ANALYZER=y
96+
CONFIG_THREAD_STACK_INFO=y
97+
CONFIG_THREAD_RUNTIME_STATS=y
98+
#CONFIG_THREAD_RUNTIME_STATS_USE_TIMING_FUNCTIONS=n
99+
#CONFIG_SCHED_THREAD_USAGE=y
100+
#CONFIG_SCHED_THREAD_USAGE_ANALYSIS=y
101+
CONFIG_STATS=y
102+
CONFIG_STATS_SHELL=y
103+
104+
#
105+
# Storage
106+
#
107+
#CONFIG_FLASH=y
108+
#CONFIG_FLASH_MAP=y
109+
#CONFIG_FLASH_PAGE_LAYOUT=y
110+
# native_posix uses a simulated flash
111+
#CONFIG_FLASH_SIMULATOR=y
112+
#CONFIG_DISK_ACCESS=y.
113+
#CONFIG_FILE_SYSTEM=y
114+
#CONFIG_FILE_SYSTEM_LITTLEFS=y
115+
#CONFIG_FILE_SYSTEM_SHELL=y
116+
#CONFIG_NVS=y
117+
#CONFIG_SETTINGS=y
118+
#CONFIG_SETTINGS_NVS=y
119+
#CONFIG_SETTINGS_RUNTIME=y
120+
#CONFIG_SETTINGS_FILE=y
121+
#CONFIG_SETTINGS_SHELL=y
122+
123+
CONFIG_TEST_RANDOM_GENERATOR=y
124+
CONFIG_TIMER_RANDOM_GENERATOR=y
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
sample:
2+
name: BACnet Smart Actuator (B-SA)
3+
4+
tests:
5+
bacnet-stack.sample.profile.b-sa.bacdl_none:
6+
tags: bacnet
7+
platform_allow: qemu_x86 native_posix native_posix_64 native_sim
8+
bacnet-stack.sample.profile.b-sa.bacdl_mstp:
9+
platform_allow: native_sim
10+
extra_configs:
11+
- CONFIG_BACDL_MSTP=y
12+
tags: introduction
13+
bacnet-stack.sample.profile.b-sa.bacdl_bip:
14+
platform_allow: native_sim
15+
extra_configs:
16+
- CONFIG_BACDL_BIP=y
17+
tags: introduction
18+
bacnet-stack.sample.profile.b-sa.bacdl_bip6:
19+
platform_allow: native_sim
20+
extra_configs:
21+
- CONFIG_BACDL_BIP6=y
22+
tags: introduction
23+
bacnet-stack.sample.profile.b-sa.bacdl_ethernet:
24+
platform_allow: native_sim
25+
extra_configs:
26+
- CONFIG_BACDL_ETHERNET=y
27+
tags: introduction
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
/*
2+
* Copyright (C) 2020 Legrand North America, Inc.
3+
*
4+
* SPDX-License-Identifier: MIT
5+
*/
6+
7+
#include <zephyr/kernel.h>
8+
#include <zephyr/random/random.h>
9+
#include <stdint.h>
10+
#include <stdlib.h>
11+
12+
/* BACnet Stack defines - first */
13+
#include "bacnet/bacdef.h"
14+
/* BACnet Stack core API */
15+
#include "bacnet/version.h"
16+
#include "bacnet/basic/sys/mstimer.h"
17+
/* BACnet Stack basic device API - see bacnet_basic/device.c for details */
18+
#include "bacnet/basic/object/device.h"
19+
/* BACnet Stack basic objects enabled in prj.conf */
20+
#include "bacnet/basic/object/ao.h"
21+
#if (BACNET_PROTOCOL_REVISION >= 17)
22+
#include "bacnet/basic/object/netport.h"
23+
#endif
24+
#include "bacnet_basic/bacnet_basic.h"
25+
26+
/* Logging module registration is already done in ports/zephyr/main.c */
27+
#include "bacnet_osif/bacnet_log.h"
28+
LOG_MODULE_DECLARE(bacnet, CONFIG_BACNETSTACK_LOG_LEVEL);
29+
30+
static const uint32_t Device_Instance = 260123;
31+
static const uint32_t Actuator_Instance = 1;
32+
/* timer for Actuator Update Interval */
33+
static struct mstimer Actuator_Update_Timer;
34+
35+
static void BACnet_Smart_Actuator_Datalink_Init(void)
36+
{
37+
}
38+
39+
/**
40+
* @brief BACnet Project Initialization Handler
41+
* @param context [in] The context to pass to the callback function
42+
* @note This is called from the BACnet task
43+
*/
44+
static void BACnet_Smart_Actuator_Init_Handler(void *context)
45+
{
46+
(void)context;
47+
LOG_INF("BACnet Stack Initialized");
48+
BACnet_Smart_Actuator_Datalink_Init();
49+
/* initialize objects for this basic sample */
50+
Device_Init(NULL);
51+
Device_Set_Object_Instance_Number(Device_Instance);
52+
Analog_Output_Create(Actuator_Instance);
53+
Analog_Output_Name_Set(Actuator_Instance, "Actuator");
54+
Analog_Output_Units_Set(Actuator_Instance, UNITS_PERCENT);
55+
Analog_Output_Min_Pres_Value_Set(Actuator_Instance, 0.0f);
56+
Analog_Output_Max_Pres_Value_Set(Actuator_Instance, 100.0f);
57+
LOG_INF("BACnet Device ID: %u", Device_Object_Instance_Number());
58+
/* start the seconds cyclic timer */
59+
mstimer_set(&Actuator_Update_Timer, 1000);
60+
srand(sys_rand32_get());
61+
}
62+
63+
/**
64+
* @brief BACnet Project Task Handler
65+
* @param context [in] The context to pass to the callback function
66+
* @note This is called from the BACnet task
67+
*/
68+
static void BACnet_Smart_Actuator_Task_Handler(void *context)
69+
{
70+
float percent = 0.0f, change = 0.0f;
71+
72+
(void)context;
73+
if (mstimer_expired(&Actuator_Update_Timer)) {
74+
mstimer_reset(&Actuator_Update_Timer);
75+
/* simulate an internal software program,
76+
and update the BACnet object values */
77+
if (Analog_Output_Out_Of_Service(Actuator_Instance)) {
78+
return;
79+
}
80+
percent = Analog_Output_Present_Value(Actuator_Instance);
81+
change = -1.0f + 2.0f * ((float)rand()) / RAND_MAX;
82+
percent += change;
83+
Analog_Output_Present_Value_Set(Actuator_Instance, percent,
84+
BACNET_MAX_PRIORITY);
85+
}
86+
}
87+
88+
int main(void)
89+
{
90+
LOG_INF("*** BACnet Smart Actuator (B-SA) ***");
91+
LOG_INF("BACnet Stack Version " BACNET_VERSION_TEXT);
92+
LOG_INF("BACnet Stack Max APDU: %d", MAX_APDU);
93+
bacnet_basic_init_callback_set(BACnet_Smart_Actuator_Init_Handler,
94+
NULL);
95+
bacnet_basic_task_callback_set(BACnet_Smart_Actuator_Task_Handler,
96+
NULL);
97+
/* work happens in server module */
98+
for (;;) {
99+
k_sleep(K_MSEC(1000));
100+
}
101+
102+
return 0;
103+
}

0 commit comments

Comments
 (0)