Skip to content

Commit b8aeb5a

Browse files
authored
Integrated BACnet Settings subys into the profile samples (#30)
2 parents 297cd38 + 78805a4 commit b8aeb5a

File tree

9 files changed

+438
-96
lines changed

9 files changed

+438
-96
lines changed

.pre-commit-config.yaml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ exclude: build|\.git|external/|BACnet\-Server\.X/|tools/(avstack|check\-stack\-u
1616

1717
repos:
1818
- repo: https://github.com/pre-commit/pre-commit-hooks
19-
rev: 2c9f875913ee60ca25ce70243dc24d5b6415598c # v4.6.0
19+
rev: v5.0.0
2020
hooks:
2121
- id: check-merge-conflict
2222
args: [--assume-in-merge]
@@ -36,7 +36,7 @@ repos:
3636
- id: trailing-whitespace
3737

3838
- repo: https://github.com/Lucas-C/pre-commit-hooks
39-
rev: a30f0d816e5062a67d87c8de753cfe499672b959 # v1.5.5
39+
rev: v1.5.5
4040
hooks:
4141
- id: remove-tabs
4242
name: Remove tabs (4 spaces)
@@ -48,7 +48,7 @@ repos:
4848
files: '.*\.(yaml|yml|html|htm)|Dockerfile$'
4949

5050
- repo: https://github.com/pre-commit/mirrors-clang-format
51-
rev: 05241dc3def184dba136e62d54ff57f1c8a497a9 # v17.0.6
51+
rev: v20.1.5
5252
hooks:
5353
- id: clang-format
5454

@@ -59,12 +59,12 @@ repos:
5959
# - id: prettier
6060

6161
- repo: https://github.com/pre-commit/pygrep-hooks
62-
rev: v1.10.0 # v1.10.0
62+
rev: v1.10.0
6363
hooks:
6464
- id: text-unicode-replacement-char
6565

6666
- repo: https://github.com/editorconfig-checker/editorconfig-checker.python
67-
rev: 3.2.0 #2.6.2
67+
rev: 3.2.0
6868
hooks:
6969
- id: editorconfig-checker
7070
alias: ec

samples.sh

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,35 @@ rm -rf "$OUTPUT_DIR"
1515
# Run twister with the specified test cases and output directory
1616
"$TWISTER_EXE" -O "$OUTPUT_DIR" -T "$TEST_CASES_DIR"
1717

18+
# twister output directory cleanup files we do not archive
19+
find $OUTPUT_DIR -name 'CMakeFiles' -exec rm -rf {} \;
20+
find $OUTPUT_DIR -name 'modules' -exec rm -rf {} \;
21+
find $OUTPUT_DIR -name 'app' -exec rm -rf \
22+
'{}/../zephyr/arch
23+
{}/../zephyr/boards
24+
{}/../zephyr/cmake
25+
{}/../zephyr/CMakeFiles
26+
{}/../zephyr/dev_graph.dot
27+
{}/../zephyr/drivers
28+
{}/../zephyr/dts.cmake
29+
{}/../zephyr/edt.pickle
30+
{}/../zephyr/include
31+
{}/../zephyr/isrList.bin
32+
{}/../zephyr/kconfig
33+
{}/../zephyr/kernel
34+
{}/../zephyr/lib
35+
{}/../zephyr/libzephyr.a
36+
{}/../zephyr/misc
37+
{}/../zephyr/modules
38+
{}/../zephyr/soc
39+
{}/../zephyr/subsys
40+
{}/../Makefile
41+
{}/../Kconfig
42+
{}/../cmake_install.cmake
43+
{}/../CMakeCache.txt' \;
44+
find $OUTPUT_DIR -name 'app' -exec rm -rf '{}' \;
45+
echo "Twister output cleanup completed successfully."
46+
1847
# Check if twister ran successfully
1948
if [ $? -eq 0 ]; then
2049
echo "Twister testing completed successfully."

unittest.sh

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,35 @@ rm -rf "$OUTPUT_DIR"
1717
# Run twister with the specified test cases and output directory
1818
"$TWISTER_EXE" -O "$OUTPUT_DIR" -p "$TWISTER_PLATFORM" -T "$TEST_CASES_DIR"
1919

20+
# twister output directory cleanup files we do not archive
21+
find $OUTPUT_DIR -name 'CMakeFiles' -exec rm -rf {} \;
22+
find $OUTPUT_DIR -name 'modules' -exec rm -rf {} \;
23+
find $OUTPUT_DIR -name 'app' -exec rm -rf \
24+
'{}/../zephyr/arch
25+
{}/../zephyr/boards
26+
{}/../zephyr/cmake
27+
{}/../zephyr/CMakeFiles
28+
{}/../zephyr/dev_graph.dot
29+
{}/../zephyr/drivers
30+
{}/../zephyr/dts.cmake
31+
{}/../zephyr/edt.pickle
32+
{}/../zephyr/include
33+
{}/../zephyr/isrList.bin
34+
{}/../zephyr/kconfig
35+
{}/../zephyr/kernel
36+
{}/../zephyr/lib
37+
{}/../zephyr/libzephyr.a
38+
{}/../zephyr/misc
39+
{}/../zephyr/modules
40+
{}/../zephyr/soc
41+
{}/../zephyr/subsys
42+
{}/../Makefile
43+
{}/../Kconfig
44+
{}/../cmake_install.cmake
45+
{}/../CMakeCache.txt' \;
46+
find $OUTPUT_DIR -name 'app' -exec rm -rf '{}' \;
47+
echo "Twister output cleanup completed successfully."
48+
2049
# Check if twister ran successfully
2150
if [ $? -eq 0 ]; then
2251
echo "Twister testing completed successfully."

zephyr/include/bacnet_settings/bacnet_settings.h

Lines changed: 29 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -15,62 +15,57 @@
1515
#include "bacnet/bacapp.h"
1616
#include "bacnet/bacstr.h"
1717
#include "bacnet/bacint.h"
18+
#include "bacnet/wp.h"
1819

1920
#ifdef __cplusplus
2021
extern "C" {
2122
#endif /* __cplusplus */
2223

23-
int bacnet_settings_value_get(uint16_t object_type, uint32_t object_instance,
24-
uint32_t property_id, uint32_t array_index,
25-
BACNET_APPLICATION_DATA_VALUE *value);
26-
bool bacnet_settings_value_set(uint16_t object_type, uint32_t object_instance,
27-
uint32_t property_id, uint32_t array_index,
28-
BACNET_APPLICATION_DATA_VALUE *value);
24+
void bacnet_settings_basic_store(BACNET_OBJECT_TYPE object_type, uint32_t object_instance,
25+
BACNET_PROPERTY_ID object_property, BACNET_ARRAY_INDEX array_index,
26+
uint8_t *application_data, int application_data_len);
27+
bool bacnet_settings_write_property_store(BACNET_WRITE_PROPERTY_DATA *wp_data);
28+
bool bacnet_settings_write_property_restore(uint16_t object_type, uint32_t object_instance,
29+
uint32_t property_id, uint32_t array_index,
30+
write_property_function write_function);
2931

30-
int bacnet_settings_real_get(uint16_t object_type, uint32_t object_instance,
31-
uint32_t property_id, uint32_t array_index,
32-
float default_value, float *value);
33-
bool bacnet_settings_real_set(uint16_t object_type, uint32_t object_instance,
34-
uint32_t property_id, uint32_t array_index,
35-
float value);
32+
int bacnet_settings_value_get(uint16_t object_type, uint32_t object_instance, uint32_t property_id,
33+
uint32_t array_index, BACNET_APPLICATION_DATA_VALUE *value);
34+
bool bacnet_settings_value_set(uint16_t object_type, uint32_t object_instance, uint32_t property_id,
35+
uint32_t array_index, BACNET_APPLICATION_DATA_VALUE *value);
36+
37+
int bacnet_settings_real_get(uint16_t object_type, uint32_t object_instance, uint32_t property_id,
38+
uint32_t array_index, float default_value, float *value);
39+
bool bacnet_settings_real_set(uint16_t object_type, uint32_t object_instance, uint32_t property_id,
40+
uint32_t array_index, float value);
3641

3742
int bacnet_settings_unsigned_get(uint16_t object_type, uint32_t object_instance,
3843
uint32_t property_id, uint32_t array_index,
3944
BACNET_UNSIGNED_INTEGER default_value,
4045
BACNET_UNSIGNED_INTEGER *value);
41-
bool bacnet_settings_unsigned_set(uint16_t object_type,
42-
uint32_t object_instance,
46+
bool bacnet_settings_unsigned_set(uint16_t object_type, uint32_t object_instance,
4347
uint32_t property_id, uint32_t array_index,
4448
BACNET_UNSIGNED_INTEGER value);
4549

46-
int bacnet_settings_signed_get(uint16_t object_type, uint32_t object_instance,
47-
uint32_t property_id, uint32_t array_index,
48-
int32_t default_value, int32_t *value);
50+
int bacnet_settings_signed_get(uint16_t object_type, uint32_t object_instance, uint32_t property_id,
51+
uint32_t array_index, int32_t default_value, int32_t *value);
4952
bool bacnet_settings_signed_set(uint16_t object_type, uint32_t object_instance,
50-
uint32_t property_id, uint32_t array_index,
51-
int32_t value);
53+
uint32_t property_id, uint32_t array_index, int32_t value);
5254

53-
int bacnet_settings_characterstring_get(uint16_t object_type,
54-
uint32_t object_instance,
55-
uint32_t property_id,
56-
uint32_t array_index,
57-
const char *default_value,
58-
BACNET_CHARACTER_STRING *value);
55+
int bacnet_settings_characterstring_get(uint16_t object_type, uint32_t object_instance,
56+
uint32_t property_id, uint32_t array_index,
57+
const char *default_value, BACNET_CHARACTER_STRING *value);
5958

60-
bool bacnet_settings_characterstring_ansi_set(uint16_t object_type,
61-
uint32_t object_instance,
62-
uint32_t property_id,
63-
uint32_t array_index,
59+
bool bacnet_settings_characterstring_ansi_set(uint16_t object_type, uint32_t object_instance,
60+
uint32_t property_id, uint32_t array_index,
6461
const char *cstring);
6562

66-
int bacnet_settings_string_get(uint16_t object_type, uint32_t object_instance,
67-
uint32_t property_id, uint32_t array_index,
68-
const char *default_value, char *value,
63+
int bacnet_settings_string_get(uint16_t object_type, uint32_t object_instance, uint32_t property_id,
64+
uint32_t array_index, const char *default_value, char *value,
6965
size_t value_size);
7066

7167
bool bacnet_settings_string_set(uint16_t object_type, uint32_t object_instance,
72-
uint32_t property_id, uint32_t array_index,
73-
const char *value);
68+
uint32_t property_id, uint32_t array_index, const char *value);
7469

7570
#ifdef __cplusplus
7671
}

zephyr/samples/profiles/b-ld/src/main.c

Lines changed: 63 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,15 @@
2626
#include "bacnet/basic/server/bacnet_basic.h"
2727
#include "bacnet/basic/server/bacnet_port.h"
2828

29+
/* BACnet Stack Zephyr services */
30+
#include <bacnet_settings/bacnet_settings.h>
2931
/* Logging module registration is already done in ports/zephyr/main.c */
30-
#include "bacnet_osif/bacnet_log.h"
32+
#include <bacnet_osif/bacnet_log.h>
3133
LOG_MODULE_DECLARE(bacnet, CONFIG_BACNETSTACK_LOG_LEVEL);
3234

33-
/* FIXME: get the device instance and name from settings! */
35+
/* Default values before we get the device instance and name from settings */
3436
static const char *Device_Name = "BACnet Lighting Device (B-LD)";
37+
static const uint32_t Device_Instance = 260125;
3538
/* object instances */
3639
static const uint32_t Lighting_Instance = 1;
3740

@@ -68,14 +71,64 @@ void BACnet_Lighting_Output_Tracking_Value_Handler(uint32_t object_instance, flo
6871
*/
6972
static void BACnet_Lighting_Device_Init_Handler(void *context)
7073
{
74+
uint32_t array_index = BACNET_ARRAY_ALL;
75+
bool status = false;
76+
int i;
77+
int32_t lighting_output_writeable_property_list[] = {
78+
/* list of properties to set via WriteProperty */
79+
PROP_OUT_OF_SERVICE,
80+
PROP_DEFAULT_FADE_TIME,
81+
PROP_DEFAULT_RAMP_RATE,
82+
PROP_DEFAULT_STEP_INCREMENT,
83+
PROP_TRANSITION,
84+
PROP_PRESENT_VALUE,
85+
PROP_RELINQUISH_DEFAULT,
86+
PROP_BLINK_WARN_ENABLE,
87+
PROP_EGRESS_TIME,
88+
PROP_DEFAULT_FADE_TIME,
89+
PROP_DEFAULT_RAMP_RATE,
90+
PROP_LIGHTING_COMMAND_DEFAULT_PRIORITY,
91+
PROP_DEFAULT_STEP_INCREMENT,
92+
PROP_TRANSITION};
93+
int32_t device_writeable_property_list[] = {
94+
/* list of properties to set via WriteProperty */
95+
PROP_OBJECT_IDENTIFIER,
96+
PROP_OBJECT_NAME,
97+
};
98+
7199
(void)context;
72100
LOG_INF("BACnet Stack Initialized");
73-
/* initialize objects for this basic sample */
101+
/* initialize objects with default values for this basic sample */
102+
Device_Set_Object_Instance_Number(Device_Instance);
74103
Device_Object_Name_ANSI_Init(Device_Name);
104+
/* lighting output object */
75105
Lighting_Output_Create(Lighting_Instance);
76106
Lighting_Output_Name_Set(Lighting_Instance, "Light-1");
107+
/* restore any property values previously stored via WriteProperty */
108+
for (i = 0; i < ARRAY_SIZE(device_writeable_property_list); i++) {
109+
status = bacnet_settings_write_property_restore(
110+
OBJECT_DEVICE, BACNET_MAX_INSTANCE, device_writeable_property_list[i],
111+
array_index, Device_Write_Property_Local);
112+
if (!status) {
113+
/* no settings stored for this property, use defaults */
114+
}
115+
}
116+
for (i = 0; i < ARRAY_SIZE(lighting_output_writeable_property_list); i++) {
117+
status = bacnet_settings_write_property_restore(
118+
OBJECT_LIGHTING_OUTPUT, Lighting_Instance,
119+
lighting_output_writeable_property_list[i], array_index,
120+
Lighting_Output_Write_Property);
121+
if (!status) {
122+
/* no settings stored for this property, use defaults */
123+
}
124+
}
125+
/* These writable property values are stored WriteProperty.
126+
Set this callback after init to prevent recursion. */
127+
bacnet_basic_store_callback_set(bacnet_settings_basic_store);
128+
/* lighting output callbacks */
77129
Lighting_Output_Write_Present_Value_Callback_Set(
78130
BACnet_Lighting_Output_Tracking_Value_Handler);
131+
/* done */
79132
LOG_INF("BACnet Device ID: %u", Device_Object_Instance_Number());
80133
/* set the BACnet Basic Task device object timer for lighting output use */
81134
bacnet_basic_task_object_timer_set(10UL);
@@ -94,24 +147,22 @@ static void BACnet_Lighting_Device_Task_Handler(void *context)
94147

95148
int main(void)
96149
{
150+
bool port_initialized = false;
151+
97152
LOG_INF("BACnet Device: %s", Device_Name);
98153
LOG_INF("BACnet Stack Version " BACNET_VERSION_TEXT);
99154
LOG_INF("BACnet Stack Max APDU: %d", MAX_APDU);
100155
bacnet_basic_init_callback_set(BACnet_Lighting_Device_Init_Handler, NULL);
101156
bacnet_basic_task_callback_set(BACnet_Lighting_Device_Task_Handler, NULL);
102157
bacnet_basic_init();
103-
for (;;) {
104-
if (bacnet_port_init()) {
105-
break;
106-
} else {
107-
LOG_ERR("Server: port initialization failed");
108-
k_sleep(K_MSEC(1000));
109-
}
110-
}
111158
for (;;) {
112159
k_sleep(K_MSEC(CONFIG_BACNET_BASIC_SERVER_KSLEEP));
113160
bacnet_basic_task();
114-
bacnet_port_task();
161+
if (port_initialized) {
162+
bacnet_port_task();
163+
} else {
164+
port_initialized = bacnet_port_init();
165+
}
115166
}
116167

117168
return 0;

0 commit comments

Comments
 (0)