Files
bacnet_stack/src/bacnet/dailyschedule.c
T
Steve Karg 524fd162f9 Feature/basic-schedule-object-write-properties (#1000)
* Added schedule object WriteProperty handling for effective-period, list-of-object-property-references and exception-schedule properties.
2025-05-20 15:04:14 -05:00

115 lines
3.1 KiB
C

/**
* @file
* @brief BACnetDailySchedule complex data type encode and decode
* @author Ondřej Hruška <ondra@ondrovo.com>
* @author Steve Karg <skarg@users.sourceforge.net>
* @date February 2024
* @copyright SPDX-License-Identifier: GPL-2.0-or-later WITH GCC-exception-2.0
*/
#include <stdint.h>
#include "bacnet/dailyschedule.h"
#include "bacnet/bactimevalue.h"
/**
* @brief Encode a BACnetDailySchedule value to a buffer
* @param apdu [out] Buffer to encode to
* @param apdu_size [in] Size of the buffer
* @param tag_number [in] Tag number to use
* @param day [in] Value to encode
* @return Number of bytes encoded, or BACNET_STATUS_ERROR if an error occurs
*/
int bacnet_dailyschedule_context_decode(
const uint8_t *apdu,
int apdu_size,
uint8_t tag_number,
BACNET_DAILY_SCHEDULE *day)
{
unsigned int tv_count = 0;
int len = 0;
if (day == NULL) {
return BACNET_STATUS_ERROR;
}
if (apdu == NULL) {
return BACNET_STATUS_ERROR;
}
len = bacnet_time_values_context_decode(
apdu, apdu_size, tag_number, &day->Time_Values[0],
ARRAY_SIZE(day->Time_Values), &tv_count);
if (len < 0) {
return BACNET_STATUS_ERROR;
}
day->TV_Count = (uint16_t)tv_count;
return len;
}
/**
* @brief Encode a BACnetDailySchedule value to a buffer
* @param apdu [out] Buffer to encode to
* @param tag_number [in] Tag number to use
* @param day [in] Value to encode
* @return Number of bytes encoded, or BACNET_STATUS_ERROR if an error occurs
*/
int bacnet_dailyschedule_context_encode(
uint8_t *apdu, uint8_t tag_number, const BACNET_DAILY_SCHEDULE *day)
{
if (day == NULL) {
return BACNET_STATUS_ERROR;
}
if (day->TV_Count > ARRAY_SIZE(day->Time_Values)) {
return BACNET_STATUS_ERROR;
}
return bacnet_time_values_context_encode(
apdu, tag_number, &day->Time_Values[0], day->TV_Count);
}
/**
* @brief Compare two BACnetDailySchedule values
* @param a [in] First value to compare
* @param b [in] Second value to compare
* @return true if the values are the same, false otherwise
* @note If either value is NULL, false is returned.
*/
bool bacnet_dailyschedule_same(
const BACNET_DAILY_SCHEDULE *a, const BACNET_DAILY_SCHEDULE *b)
{
unsigned i;
if (a == NULL || b == NULL) {
return false;
}
if (a->TV_Count != b->TV_Count) {
return false;
}
for (i = 0; i < a->TV_Count; i++) {
if (!bacnet_time_value_same(&a->Time_Values[i], &b->Time_Values[i])) {
return false;
}
}
return true;
}
/**
* @brief Copy a BACnetDailySchedule value
* @param dest [out] Destination to copy to
* @param src [in] Source to copy from
*/
void bacnet_dailyschedule_copy(
BACNET_DAILY_SCHEDULE *dest, const BACNET_DAILY_SCHEDULE *src)
{
unsigned i;
if (dest == NULL || src == NULL) {
return;
}
if (src->TV_Count > ARRAY_SIZE(dest->Time_Values)) {
return;
}
dest->TV_Count = src->TV_Count;
for (i = 0; i < dest->TV_Count; i++) {
bacnet_time_value_copy(&dest->Time_Values[i], &src->Time_Values[i]);
}
}