Standardized the comments and indentation using the comment.sh and indent.sh scripts.
This commit is contained in:
+13
-20
@@ -173,8 +173,7 @@ int bacapp_decode_application_data(uint8_t * apdu,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int bacapp_encode_context_data(uint8_t * apdu,
|
int bacapp_encode_context_data(uint8_t * apdu,
|
||||||
BACNET_APPLICATION_DATA_VALUE * value,
|
BACNET_APPLICATION_DATA_VALUE * value, BACNET_PROPERTY_ID property)
|
||||||
BACNET_PROPERTY_ID property)
|
|
||||||
{
|
{
|
||||||
int apdu_len = 0; /* total length of the apdu, return value */
|
int apdu_len = 0; /* total length of the apdu, return value */
|
||||||
|
|
||||||
@@ -188,8 +187,7 @@ int bacapp_encode_context_data(uint8_t * apdu,
|
|||||||
value->type.Unsigned_Int);
|
value->type.Unsigned_Int);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
apdu_len = encode_tagged_real(&apdu[0],
|
apdu_len = encode_tagged_real(&apdu[0], value->type.Real);
|
||||||
value->type.Real);
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
apdu_len = 0;
|
apdu_len = 0;
|
||||||
@@ -226,12 +224,10 @@ int bacapp_decode_context_data(uint8_t * apdu,
|
|||||||
case 0:
|
case 0:
|
||||||
case 1:
|
case 1:
|
||||||
len += decode_unsigned(&apdu[len],
|
len += decode_unsigned(&apdu[len],
|
||||||
len_value_type,
|
len_value_type, &(value->type.Unsigned_Int));
|
||||||
&(value->type.Unsigned_Int));
|
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
len += decode_real(&apdu[len],
|
len += decode_real(&apdu[len], &(value->type.Real));
|
||||||
&(value->type.Real));
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
len = 0;
|
len = 0;
|
||||||
@@ -277,10 +273,12 @@ bool bacapp_copy(BACNET_APPLICATION_DATA_VALUE * dest_value,
|
|||||||
dest_value->type.Enumerated = src_value->type.Enumerated;
|
dest_value->type.Enumerated = src_value->type.Enumerated;
|
||||||
break;
|
break;
|
||||||
case BACNET_APPLICATION_TAG_DATE:
|
case BACNET_APPLICATION_TAG_DATE:
|
||||||
datetime_copy_date(&dest_value->type.Date, &src_value->type.Date);
|
datetime_copy_date(&dest_value->type.Date,
|
||||||
|
&src_value->type.Date);
|
||||||
break;
|
break;
|
||||||
case BACNET_APPLICATION_TAG_TIME:
|
case BACNET_APPLICATION_TAG_TIME:
|
||||||
datetime_copy_time(&dest_value->type.Time, &src_value->type.Time);
|
datetime_copy_time(&dest_value->type.Time,
|
||||||
|
&src_value->type.Time);
|
||||||
break;
|
break;
|
||||||
case BACNET_APPLICATION_TAG_OBJECT_ID:
|
case BACNET_APPLICATION_TAG_OBJECT_ID:
|
||||||
dest_value->type.Object_Id.type =
|
dest_value->type.Object_Id.type =
|
||||||
@@ -352,8 +350,7 @@ int bacapp_data_len(uint8_t *apdu, int max_apdu_len,
|
|||||||
if (opening_tag_number_counter)
|
if (opening_tag_number_counter)
|
||||||
total_len += len;
|
total_len += len;
|
||||||
/* ERROR! */
|
/* ERROR! */
|
||||||
if (apdu_len > max_apdu_len)
|
if (apdu_len > max_apdu_len) {
|
||||||
{
|
|
||||||
total_len = -1;
|
total_len = -1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -609,8 +606,7 @@ void testBACnetApplicationDataLength(Test * pTest)
|
|||||||
len = encode_closing_tag(&apdu[apdu_len], 3);
|
len = encode_closing_tag(&apdu[apdu_len], 3);
|
||||||
apdu_len += len;
|
apdu_len += len;
|
||||||
/* verify the length of the data inside the opening/closing tags */
|
/* verify the length of the data inside the opening/closing tags */
|
||||||
len = bacapp_data_len(&apdu[0], apdu_len,
|
len = bacapp_data_len(&apdu[0], apdu_len, PROP_OBJECT_IDENTIFIER);
|
||||||
PROP_OBJECT_IDENTIFIER);
|
|
||||||
ct_test(pTest, test_len == len);
|
ct_test(pTest, test_len == len);
|
||||||
|
|
||||||
/* 3. application tagged data, multiple elements */
|
/* 3. application tagged data, multiple elements */
|
||||||
@@ -669,8 +665,7 @@ void testBACnetApplicationDataLength(Test * pTest)
|
|||||||
len = encode_closing_tag(&apdu[apdu_len], 3);
|
len = encode_closing_tag(&apdu[apdu_len], 3);
|
||||||
apdu_len += len;
|
apdu_len += len;
|
||||||
/* verify the length of the data inside the opening/closing tags */
|
/* verify the length of the data inside the opening/closing tags */
|
||||||
len = bacapp_data_len(&apdu[0], apdu_len,
|
len = bacapp_data_len(&apdu[0], apdu_len, PROP_PRIORITY_ARRAY);
|
||||||
PROP_PRIORITY_ARRAY);
|
|
||||||
ct_test(pTest, test_len == len);
|
ct_test(pTest, test_len == len);
|
||||||
|
|
||||||
/* 4. complex datatype - one element */
|
/* 4. complex datatype - one element */
|
||||||
@@ -701,8 +696,7 @@ void testBACnetApplicationDataLength(Test * pTest)
|
|||||||
len = encode_closing_tag(&apdu[apdu_len], 3);
|
len = encode_closing_tag(&apdu[apdu_len], 3);
|
||||||
apdu_len += len;
|
apdu_len += len;
|
||||||
/* verify the length of the data inside the opening/closing tags */
|
/* verify the length of the data inside the opening/closing tags */
|
||||||
len = bacapp_data_len(&apdu[0], apdu_len,
|
len = bacapp_data_len(&apdu[0], apdu_len, PROP_START_TIME);
|
||||||
PROP_START_TIME);
|
|
||||||
ct_test(pTest, test_len == len);
|
ct_test(pTest, test_len == len);
|
||||||
|
|
||||||
/* 5. complex datatype - multiple elements */
|
/* 5. complex datatype - multiple elements */
|
||||||
@@ -720,8 +714,7 @@ void testBACnetApplicationDataLength(Test * pTest)
|
|||||||
len = encode_closing_tag(&apdu[apdu_len], 3);
|
len = encode_closing_tag(&apdu[apdu_len], 3);
|
||||||
apdu_len += len;
|
apdu_len += len;
|
||||||
/* verify the length of the data inside the opening/closing tags */
|
/* verify the length of the data inside the opening/closing tags */
|
||||||
len = bacapp_data_len(&apdu[0], apdu_len,
|
len = bacapp_data_len(&apdu[0], apdu_len, PROP_REQUESTED_SHED_LEVEL);
|
||||||
PROP_REQUESTED_SHED_LEVEL);
|
|
||||||
ct_test(pTest, test_len == len);
|
ct_test(pTest, test_len == len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -731,7 +731,8 @@ int encode_tagged_boolean(uint8_t * apdu, bool boolean_value)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* context tagged is encoded differently */
|
/* context tagged is encoded differently */
|
||||||
int encode_context_boolean(uint8_t * apdu, int tag_number, bool boolean_value)
|
int encode_context_boolean(uint8_t * apdu, int tag_number,
|
||||||
|
bool boolean_value)
|
||||||
{
|
{
|
||||||
int len = 1; /* return value */
|
int len = 1; /* return value */
|
||||||
|
|
||||||
|
|||||||
+118
-58
@@ -203,13 +203,19 @@ INDTEXT_DATA bacnet_object_type_names[] = {
|
|||||||
,
|
,
|
||||||
{OBJECT_ACCUMULATOR, "Accumulator"}
|
{OBJECT_ACCUMULATOR, "Accumulator"}
|
||||||
,
|
,
|
||||||
{OBJECT_PULSE_CONVERTER, "Pulse-Converter"},
|
{OBJECT_PULSE_CONVERTER, "Pulse-Converter"}
|
||||||
|
,
|
||||||
|
|
||||||
{OBJECT_EVENT_LOG, "Event-Log"},
|
{OBJECT_EVENT_LOG, "Event-Log"}
|
||||||
{OBJECT_GLOBAL_GROUP, "Global-Group"},
|
,
|
||||||
{OBJECT_TREND_LOG_MULTIPLE, "Trend-Log-Multiple"},
|
{OBJECT_GLOBAL_GROUP, "Global-Group"}
|
||||||
{OBJECT_LOAD_CONTROL, "Load-Control"},
|
,
|
||||||
{OBJECT_STRUCTURED_VIEW, "Structured-View"},
|
{OBJECT_TREND_LOG_MULTIPLE, "Trend-Log-Multiple"}
|
||||||
|
,
|
||||||
|
{OBJECT_LOAD_CONTROL, "Load-Control"}
|
||||||
|
,
|
||||||
|
{OBJECT_STRUCTURED_VIEW, "Structured-View"}
|
||||||
|
,
|
||||||
|
|
||||||
{0, NULL}
|
{0, NULL}
|
||||||
/* Enumerated values 0-127 are reserved for definition by ASHRAE.
|
/* Enumerated values 0-127 are reserved for definition by ASHRAE.
|
||||||
@@ -566,58 +572,112 @@ INDTEXT_DATA bacnet_property_names[] = {
|
|||||||
,
|
,
|
||||||
{PROP_PROFILE_NAME, "profile-name"}
|
{PROP_PROFILE_NAME, "profile-name"}
|
||||||
,
|
,
|
||||||
{PROP_AUTO_SLAVE_DISCOVERY, "auto-slave-discovery"},
|
{PROP_AUTO_SLAVE_DISCOVERY, "auto-slave-discovery"}
|
||||||
{PROP_MANUAL_SLAVE_ADDRESS_BINDING, "manual-slave-address-binding"},
|
,
|
||||||
{PROP_SLAVE_ADDRESS_BINDING, "slave-address-binding"},
|
{PROP_MANUAL_SLAVE_ADDRESS_BINDING, "manual-slave-address-binding"}
|
||||||
{PROP_SLAVE_PROXY_ENABLE, "slave-proxy-enable"},
|
,
|
||||||
{PROP_LAST_NOTIFY_TIME, "last-notify-time"},
|
{PROP_SLAVE_ADDRESS_BINDING, "slave-address-binding"}
|
||||||
{PROP_SCHEDULE_DEFAULT, "schedule-default"},
|
,
|
||||||
{PROP_ACCEPTED_MODES, "accepted-modes"},
|
{PROP_SLAVE_PROXY_ENABLE, "slave-proxy-enable"}
|
||||||
{PROP_ADJUST_VALUE, "adjust-value"},
|
,
|
||||||
{PROP_COUNT, "count"},
|
{PROP_LAST_NOTIFY_TIME, "last-notify-time"}
|
||||||
{PROP_COUNT_BEFORE_CHANGE, "count-before-change"},
|
,
|
||||||
{PROP_COUNT_CHANGE_TIME, "count-change-time"},
|
{PROP_SCHEDULE_DEFAULT, "schedule-default"}
|
||||||
{PROP_COV_PERIOD, "COV-period"},
|
,
|
||||||
{PROP_INPUT_REFERENCE, "input-reference"},
|
{PROP_ACCEPTED_MODES, "accepted-modes"}
|
||||||
{PROP_LIMIT_MONITORING_INTERVAL, "limit-monitoring-interval"},
|
,
|
||||||
{PROP_LOGGING_DEVICE, "logging-device"},
|
{PROP_ADJUST_VALUE, "adjust-value"}
|
||||||
{PROP_LOGGING_RECORD, "logging-record"},
|
,
|
||||||
{PROP_PRESCALE, "prescale"},
|
{PROP_COUNT, "count"}
|
||||||
{PROP_PULSE_RATE, "pulse-rate"},
|
,
|
||||||
{PROP_SCALE, "scale"},
|
{PROP_COUNT_BEFORE_CHANGE, "count-before-change"}
|
||||||
{PROP_SCALE_FACTOR, "scale-factor"},
|
,
|
||||||
{PROP_UPDATE_TIME, "update-time"},
|
{PROP_COUNT_CHANGE_TIME, "count-change-time"}
|
||||||
{PROP_VALUE_BEFORE_CHANGE, "value-before-change"},
|
,
|
||||||
{PROP_VALUE_SET, "value-set"},
|
{PROP_COV_PERIOD, "COV-period"}
|
||||||
{PROP_VALUE_CHANGE_TIME, "value-change-time"},
|
,
|
||||||
{PROP_ALIGN_INTERVALS, "align-intervals"},
|
{PROP_INPUT_REFERENCE, "input-reference"}
|
||||||
{PROP_GROUP_MEMBER_NAMES, "group-member-names"},
|
,
|
||||||
{PROP_INTERVAL_OFFSET, "interval-offset"},
|
{PROP_LIMIT_MONITORING_INTERVAL, "limit-monitoring-interval"}
|
||||||
{PROP_LAST_RESTART_REASON, "last-restart-reason"},
|
,
|
||||||
{PROP_LOGGING_TYPE, "logging-type"},
|
{PROP_LOGGING_DEVICE, "logging-device"}
|
||||||
{PROP_MEMBER_STATUS_FLAGS, "member-status-flags"},
|
,
|
||||||
{PROP_NOTIFICATION_PERIOD, "notification-period"},
|
{PROP_LOGGING_RECORD, "logging-record"}
|
||||||
{PROP_PREVIOUS_NOTIFY_RECORD, "previous-notify-record"},
|
,
|
||||||
{PROP_REQUESTED_UPDATE_INTERVAL, "requested-update-interval"},
|
{PROP_PRESCALE, "prescale"}
|
||||||
{PROP_RESTART_NOTIFICATION_RECIPIENTS, "restart-notification-recipients"},
|
,
|
||||||
{PROP_TIME_OF_DEVICE_RESTART, "time-of-device-restart"},
|
{PROP_PULSE_RATE, "pulse-rate"}
|
||||||
{PROP_TIME_SYNCHRONIZATION_INTERVAL, "time-synchronization-interval"},
|
,
|
||||||
{PROP_TRIGGER, "trigger"},
|
{PROP_SCALE, "scale"}
|
||||||
{PROP_UTC_TIME_SYNCHRONIZATION_RECIPIENTS, "UTC-time-synchronization-recipients"},
|
,
|
||||||
{PROP_NODE_SUBTYPE, "node-subtype"},
|
{PROP_SCALE_FACTOR, "scale-factor"}
|
||||||
{PROP_NODE_TYPE, "node-type"},
|
,
|
||||||
{PROP_STRUCTURED_OBJECT_LIST, "structured-object-list"},
|
{PROP_UPDATE_TIME, "update-time"}
|
||||||
{PROP_SUBORDINATE_ANNOTATIONS, "subordinate-annotations"},
|
,
|
||||||
{PROP_SUBORDINATE_LIST, "subordinate-list"},
|
{PROP_VALUE_BEFORE_CHANGE, "value-before-change"}
|
||||||
{PROP_ACTUAL_SHED_LEVEL, "actual-shed-level"},
|
,
|
||||||
{PROP_DUTY_WINDOW, "duty-window"},
|
{PROP_VALUE_SET, "value-set"}
|
||||||
{PROP_EXPECTED_SHED_LEVEL, "expected-shed-level"},
|
,
|
||||||
{PROP_FULL_DUTY_BASELINE, "full-duty-baseline"},
|
{PROP_VALUE_CHANGE_TIME, "value-change-time"}
|
||||||
{PROP_REQUESTED_SHED_LEVEL, "requested-shed-level"},
|
,
|
||||||
{PROP_SHED_DURATION, "shed-duration"},
|
{PROP_ALIGN_INTERVALS, "align-intervals"}
|
||||||
{PROP_SHED_LEVEL_DESCRIPTIONS, "shed-level-descriptions"},
|
,
|
||||||
{PROP_SHED_LEVELS, "shed-levels"},
|
{PROP_GROUP_MEMBER_NAMES, "group-member-names"}
|
||||||
{PROP_STATE_DESCRIPTION, "state-descriptions"},
|
,
|
||||||
|
{PROP_INTERVAL_OFFSET, "interval-offset"}
|
||||||
|
,
|
||||||
|
{PROP_LAST_RESTART_REASON, "last-restart-reason"}
|
||||||
|
,
|
||||||
|
{PROP_LOGGING_TYPE, "logging-type"}
|
||||||
|
,
|
||||||
|
{PROP_MEMBER_STATUS_FLAGS, "member-status-flags"}
|
||||||
|
,
|
||||||
|
{PROP_NOTIFICATION_PERIOD, "notification-period"}
|
||||||
|
,
|
||||||
|
{PROP_PREVIOUS_NOTIFY_RECORD, "previous-notify-record"}
|
||||||
|
,
|
||||||
|
{PROP_REQUESTED_UPDATE_INTERVAL, "requested-update-interval"}
|
||||||
|
,
|
||||||
|
{PROP_RESTART_NOTIFICATION_RECIPIENTS,
|
||||||
|
"restart-notification-recipients"}
|
||||||
|
,
|
||||||
|
{PROP_TIME_OF_DEVICE_RESTART, "time-of-device-restart"}
|
||||||
|
,
|
||||||
|
{PROP_TIME_SYNCHRONIZATION_INTERVAL, "time-synchronization-interval"}
|
||||||
|
,
|
||||||
|
{PROP_TRIGGER, "trigger"}
|
||||||
|
,
|
||||||
|
{PROP_UTC_TIME_SYNCHRONIZATION_RECIPIENTS,
|
||||||
|
"UTC-time-synchronization-recipients"}
|
||||||
|
,
|
||||||
|
{PROP_NODE_SUBTYPE, "node-subtype"}
|
||||||
|
,
|
||||||
|
{PROP_NODE_TYPE, "node-type"}
|
||||||
|
,
|
||||||
|
{PROP_STRUCTURED_OBJECT_LIST, "structured-object-list"}
|
||||||
|
,
|
||||||
|
{PROP_SUBORDINATE_ANNOTATIONS, "subordinate-annotations"}
|
||||||
|
,
|
||||||
|
{PROP_SUBORDINATE_LIST, "subordinate-list"}
|
||||||
|
,
|
||||||
|
{PROP_ACTUAL_SHED_LEVEL, "actual-shed-level"}
|
||||||
|
,
|
||||||
|
{PROP_DUTY_WINDOW, "duty-window"}
|
||||||
|
,
|
||||||
|
{PROP_EXPECTED_SHED_LEVEL, "expected-shed-level"}
|
||||||
|
,
|
||||||
|
{PROP_FULL_DUTY_BASELINE, "full-duty-baseline"}
|
||||||
|
,
|
||||||
|
{PROP_REQUESTED_SHED_LEVEL, "requested-shed-level"}
|
||||||
|
,
|
||||||
|
{PROP_SHED_DURATION, "shed-duration"}
|
||||||
|
,
|
||||||
|
{PROP_SHED_LEVEL_DESCRIPTIONS, "shed-level-descriptions"}
|
||||||
|
,
|
||||||
|
{PROP_SHED_LEVELS, "shed-levels"}
|
||||||
|
,
|
||||||
|
{PROP_STATE_DESCRIPTION, "state-descriptions"}
|
||||||
|
,
|
||||||
|
|
||||||
{0, NULL}
|
{0, NULL}
|
||||||
/* Enumerated values 0-511 are reserved for definition by ASHRAE.
|
/* Enumerated values 0-511 are reserved for definition by ASHRAE.
|
||||||
|
|||||||
+28
-22
@@ -273,6 +273,7 @@ int cov_notify_decode_service_request(uint8_t * apdu,
|
|||||||
|
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
12.11.38Active_COV_Subscriptions
|
12.11.38Active_COV_Subscriptions
|
||||||
The Active_COV_Subscriptions property is a List of BACnetCOVSubscription, each of which consists of a Recipient, a
|
The Active_COV_Subscriptions property is a List of BACnetCOVSubscription, each of which consists of a Recipient, a
|
||||||
@@ -291,10 +292,8 @@ SubscribeCOV-Request ::= SEQUENCE {
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int cov_subscribe_encode_adpu(
|
int cov_subscribe_encode_adpu(uint8_t * apdu,
|
||||||
uint8_t * apdu,
|
uint8_t invoke_id, BACNET_SUBSCRIBE_COV_DATA * data)
|
||||||
uint8_t invoke_id,
|
|
||||||
BACNET_SUBSCRIBE_COV_DATA * data)
|
|
||||||
{
|
{
|
||||||
int len = 0; /* length of each encoding */
|
int len = 0; /* length of each encoding */
|
||||||
int apdu_len = 0; /* total length of the apdu, return value */
|
int apdu_len = 0; /* total length of the apdu, return value */
|
||||||
@@ -412,10 +411,8 @@ BACnetPropertyReference ::= SEQUENCE {
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int cov_subscribe_property_encode_adpu(
|
int cov_subscribe_property_encode_adpu(uint8_t * apdu,
|
||||||
uint8_t * apdu,
|
uint8_t invoke_id, BACNET_SUBSCRIBE_COV_DATA * data)
|
||||||
uint8_t invoke_id,
|
|
||||||
BACNET_SUBSCRIBE_COV_DATA * data)
|
|
||||||
{
|
{
|
||||||
int len = 0; /* length of each encoding */
|
int len = 0; /* length of each encoding */
|
||||||
int apdu_len = 0; /* total length of the apdu, return value */
|
int apdu_len = 0; /* total length of the apdu, return value */
|
||||||
@@ -648,7 +645,8 @@ int ucov_notify_decode_apdu(uint8_t * apdu,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int cov_subscribe_decode_apdu(uint8_t * apdu,
|
int cov_subscribe_decode_apdu(uint8_t * apdu,
|
||||||
unsigned apdu_len, uint8_t * invoke_id, BACNET_SUBSCRIBE_COV_DATA * data)
|
unsigned apdu_len, uint8_t * invoke_id,
|
||||||
|
BACNET_SUBSCRIBE_COV_DATA * data)
|
||||||
{
|
{
|
||||||
int len = 0;
|
int len = 0;
|
||||||
unsigned offset = 0;
|
unsigned offset = 0;
|
||||||
@@ -675,7 +673,8 @@ int cov_subscribe_decode_apdu(uint8_t * apdu,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int cov_subscribe_property_decode_apdu(uint8_t * apdu,
|
int cov_subscribe_property_decode_apdu(uint8_t * apdu,
|
||||||
unsigned apdu_len, uint8_t * invoke_id, BACNET_SUBSCRIBE_COV_DATA * data)
|
unsigned apdu_len, uint8_t * invoke_id,
|
||||||
|
BACNET_SUBSCRIBE_COV_DATA * data)
|
||||||
{
|
{
|
||||||
int len = 0;
|
int len = 0;
|
||||||
unsigned offset = 0;
|
unsigned offset = 0;
|
||||||
@@ -716,11 +715,8 @@ void npdu_encode_npdu_data(BACNET_NPDU_DATA * npdu,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* dummy function stubs */
|
/* dummy function stubs */
|
||||||
int datalink_send_pdu(
|
int datalink_send_pdu(BACNET_ADDRESS * dest,
|
||||||
BACNET_ADDRESS * dest,
|
BACNET_NPDU_DATA * npdu_data, uint8_t * pdu, unsigned pdu_len)
|
||||||
BACNET_NPDU_DATA * npdu_data,
|
|
||||||
uint8_t * pdu,
|
|
||||||
unsigned pdu_len)
|
|
||||||
{
|
{
|
||||||
(void) dest;
|
(void) dest;
|
||||||
(void) npdu_data;
|
(void) npdu_data;
|
||||||
@@ -825,7 +821,8 @@ void testCOVNotify(Test * pTest)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void testCOVSubscribeData(Test * pTest,
|
void testCOVSubscribeData(Test * pTest,
|
||||||
BACNET_SUBSCRIBE_COV_DATA * data, BACNET_SUBSCRIBE_COV_DATA * test_data)
|
BACNET_SUBSCRIBE_COV_DATA * data,
|
||||||
|
BACNET_SUBSCRIBE_COV_DATA * test_data)
|
||||||
{
|
{
|
||||||
ct_test(pTest,
|
ct_test(pTest,
|
||||||
test_data->subscriberProcessIdentifier ==
|
test_data->subscriberProcessIdentifier ==
|
||||||
@@ -836,20 +833,29 @@ void testCOVSubscribeData(Test * pTest,
|
|||||||
ct_test(pTest,
|
ct_test(pTest,
|
||||||
test_data->monitoredObjectIdentifier.instance ==
|
test_data->monitoredObjectIdentifier.instance ==
|
||||||
data->monitoredObjectIdentifier.instance);
|
data->monitoredObjectIdentifier.instance);
|
||||||
ct_test(pTest, test_data->cancellationRequest == data->cancellationRequest);
|
ct_test(pTest,
|
||||||
|
test_data->cancellationRequest == data->cancellationRequest);
|
||||||
if (!test_data->cancellationRequest) {
|
if (!test_data->cancellationRequest) {
|
||||||
ct_test(pTest, test_data->issueConfirmedNotifications == data->issueConfirmedNotifications);
|
ct_test(pTest,
|
||||||
|
test_data->issueConfirmedNotifications ==
|
||||||
|
data->issueConfirmedNotifications);
|
||||||
ct_test(pTest, test_data->lifetime == data->lifetime);
|
ct_test(pTest, test_data->lifetime == data->lifetime);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void testCOVSubscribePropertyData(Test * pTest,
|
void testCOVSubscribePropertyData(Test * pTest,
|
||||||
BACNET_SUBSCRIBE_COV_DATA * data, BACNET_SUBSCRIBE_COV_DATA * test_data)
|
BACNET_SUBSCRIBE_COV_DATA * data,
|
||||||
|
BACNET_SUBSCRIBE_COV_DATA * test_data)
|
||||||
{
|
{
|
||||||
testCOVSubscribeData(pTest, data, test_data);
|
testCOVSubscribeData(pTest, data, test_data);
|
||||||
ct_test(pTest, test_data->monitoredProperty.propertyIdentifier == data->monitoredProperty.propertyIdentifier);
|
ct_test(pTest,
|
||||||
ct_test(pTest, test_data->monitoredProperty.propertyArrayIndex == data->monitoredProperty.propertyArrayIndex);
|
test_data->monitoredProperty.propertyIdentifier ==
|
||||||
ct_test(pTest, test_data->covIncrementPresent == data->covIncrementPresent);
|
data->monitoredProperty.propertyIdentifier);
|
||||||
|
ct_test(pTest,
|
||||||
|
test_data->monitoredProperty.propertyArrayIndex ==
|
||||||
|
data->monitoredProperty.propertyArrayIndex);
|
||||||
|
ct_test(pTest,
|
||||||
|
test_data->covIncrementPresent == data->covIncrementPresent);
|
||||||
if (test_data->covIncrementPresent) {
|
if (test_data->covIncrementPresent) {
|
||||||
ct_test(pTest, test_data->covIncrement == data->covIncrement);
|
ct_test(pTest, test_data->covIncrement == data->covIncrement);
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-8
@@ -97,18 +97,14 @@ extern "C" {
|
|||||||
int cov_subscribe_property_decode_service_request(uint8_t * apdu,
|
int cov_subscribe_property_decode_service_request(uint8_t * apdu,
|
||||||
unsigned apdu_len, BACNET_SUBSCRIBE_COV_DATA * data);
|
unsigned apdu_len, BACNET_SUBSCRIBE_COV_DATA * data);
|
||||||
|
|
||||||
int cov_subscribe_property_encode_adpu(
|
int cov_subscribe_property_encode_adpu(uint8_t * apdu,
|
||||||
uint8_t * apdu,
|
uint8_t invoke_id, BACNET_SUBSCRIBE_COV_DATA * data);
|
||||||
uint8_t invoke_id,
|
|
||||||
BACNET_SUBSCRIBE_COV_DATA * data);
|
|
||||||
|
|
||||||
int cov_subscribe_decode_service_request(uint8_t * apdu,
|
int cov_subscribe_decode_service_request(uint8_t * apdu,
|
||||||
unsigned apdu_len, BACNET_SUBSCRIBE_COV_DATA * data);
|
unsigned apdu_len, BACNET_SUBSCRIBE_COV_DATA * data);
|
||||||
|
|
||||||
int cov_subscribe_encode_adpu(
|
int cov_subscribe_encode_adpu(uint8_t * apdu,
|
||||||
uint8_t * apdu,
|
uint8_t invoke_id, BACNET_SUBSCRIBE_COV_DATA * data);
|
||||||
uint8_t invoke_id,
|
|
||||||
BACNET_SUBSCRIBE_COV_DATA * data);
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef TEST
|
#ifdef TEST
|
||||||
|
|||||||
+4
-10
@@ -73,16 +73,10 @@
|
|||||||
#elif defined(BACDL_TEST)
|
#elif defined(BACDL_TEST)
|
||||||
#include "npdu.h"
|
#include "npdu.h"
|
||||||
|
|
||||||
extern int datalink_send_pdu(
|
extern int datalink_send_pdu(BACNET_ADDRESS * dest,
|
||||||
BACNET_ADDRESS * dest,
|
BACNET_NPDU_DATA * npdu_data, uint8_t * pdu, unsigned pdu_len);
|
||||||
BACNET_NPDU_DATA * npdu_data,
|
extern uint16_t datalink_receive(BACNET_ADDRESS * src,
|
||||||
uint8_t * pdu,
|
uint8_t * pdu, uint16_t max_pdu, unsigned timeout);
|
||||||
unsigned pdu_len);
|
|
||||||
extern uint16_t datalink_receive(
|
|
||||||
BACNET_ADDRESS * src,
|
|
||||||
uint8_t * pdu,
|
|
||||||
uint16_t max_pdu,
|
|
||||||
unsigned timeout);
|
|
||||||
extern void datalink_cleanup(void);
|
extern void datalink_cleanup(void);
|
||||||
extern void datalink_get_broadcast_address(BACNET_ADDRESS * dest);
|
extern void datalink_get_broadcast_address(BACNET_ADDRESS * dest);
|
||||||
extern void bip_get_my_address(BACNET_ADDRESS * my_address);
|
extern void bip_get_my_address(BACNET_ADDRESS * my_address);
|
||||||
|
|||||||
+26
-46
@@ -57,7 +57,8 @@ static uint8_t month_days(uint16_t year, uint8_t month)
|
|||||||
{
|
{
|
||||||
/* note: start with a zero in the first element to save us from a
|
/* note: start with a zero in the first element to save us from a
|
||||||
month - 1 calculation in the lookup */
|
month - 1 calculation in the lookup */
|
||||||
int month_days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
|
int month_days[13] =
|
||||||
|
{ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
|
||||||
|
|
||||||
/* February */
|
/* February */
|
||||||
if ((month == 2) && is_leap_year(year))
|
if ((month == 2) && is_leap_year(year))
|
||||||
@@ -76,17 +77,13 @@ static uint32_t days_since_epoch(uint16_t year, uint8_t month, uint8_t day)
|
|||||||
uint8_t months = 0; /* loop counter for months */
|
uint8_t months = 0; /* loop counter for months */
|
||||||
|
|
||||||
monthdays = month_days(year, month);
|
monthdays = month_days(year, month);
|
||||||
if ((year >= 1900) && (monthdays) &&
|
if ((year >= 1900) && (monthdays) && (day >= 1) && (day <= monthdays)) {
|
||||||
(day >= 1) && (day <= monthdays))
|
for (years = 1900; years < year; years++) {
|
||||||
{
|
|
||||||
for (years = 1900; years < year; years++)
|
|
||||||
{
|
|
||||||
days += 365;
|
days += 365;
|
||||||
if (is_leap_year(years))
|
if (is_leap_year(years))
|
||||||
days++;
|
days++;
|
||||||
}
|
}
|
||||||
for (months = 1; months < month; months++)
|
for (months = 1; months < month; months++) {
|
||||||
{
|
|
||||||
days += month_days(years, months);
|
days += month_days(years, months);
|
||||||
}
|
}
|
||||||
days += (day - 1);
|
days += (day - 1);
|
||||||
@@ -95,18 +92,14 @@ static uint32_t days_since_epoch(uint16_t year, uint8_t month, uint8_t day)
|
|||||||
return (days);
|
return (days);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void days_since_epoch_into_ymd(
|
static void days_since_epoch_into_ymd(uint32_t days,
|
||||||
uint32_t days,
|
uint16_t * pYear, uint8_t * pMonth, uint8_t * pDay)
|
||||||
uint16_t *pYear,
|
|
||||||
uint8_t *pMonth,
|
|
||||||
uint8_t *pDay)
|
|
||||||
{
|
{
|
||||||
int year = 1900;
|
int year = 1900;
|
||||||
int month = 1;
|
int month = 1;
|
||||||
int day = 1;
|
int day = 1;
|
||||||
|
|
||||||
while (days >= 365)
|
while (days >= 365) {
|
||||||
{
|
|
||||||
if ((is_leap_year(year)) && days == 365)
|
if ((is_leap_year(year)) && days == 365)
|
||||||
break;
|
break;
|
||||||
days -= 365;
|
days -= 365;
|
||||||
@@ -115,8 +108,7 @@ static void days_since_epoch_into_ymd(
|
|||||||
year++;
|
year++;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (days >= month_days(year, month))
|
while (days >= month_days(year, month)) {
|
||||||
{
|
|
||||||
days -= month_days(year, month);
|
days -= month_days(year, month);
|
||||||
month++;
|
month++;
|
||||||
}
|
}
|
||||||
@@ -175,7 +167,8 @@ int datetime_compare_time(BACNET_TIME * time1, BACNET_TIME * time2)
|
|||||||
if (diff == 0) {
|
if (diff == 0) {
|
||||||
diff = (int) time1->sec - (int) time2->sec;
|
diff = (int) time1->sec - (int) time2->sec;
|
||||||
if (diff == 0) {
|
if (diff == 0) {
|
||||||
diff = (int)time1->hundredths - (int)time2->hundredths;
|
diff =
|
||||||
|
(int) time1->hundredths - (int) time2->hundredths;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -220,8 +213,7 @@ void datetime_copy_time(BACNET_TIME * dest_time, BACNET_TIME * src_time)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void datetime_copy(
|
void datetime_copy(BACNET_DATE_TIME * dest_datetime,
|
||||||
BACNET_DATE_TIME * dest_datetime,
|
|
||||||
BACNET_DATE_TIME * src_datetime)
|
BACNET_DATE_TIME * src_datetime)
|
||||||
{
|
{
|
||||||
datetime_copy_time(&dest_datetime->time, &src_datetime->time);
|
datetime_copy_time(&dest_datetime->time, &src_datetime->time);
|
||||||
@@ -251,8 +243,7 @@ void datetime_set_time(BACNET_TIME * btime,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void datetime_set(BACNET_DATE_TIME * bdatetime,
|
void datetime_set(BACNET_DATE_TIME * bdatetime,
|
||||||
BACNET_DATE * bdate,
|
BACNET_DATE * bdate, BACNET_TIME * btime)
|
||||||
BACNET_TIME * btime)
|
|
||||||
{
|
{
|
||||||
if (bdate && btime && bdatetime) {
|
if (bdate && btime && bdatetime) {
|
||||||
bdatetime->time.hour = btime->hour;
|
bdatetime->time.hour = btime->hour;
|
||||||
@@ -289,9 +280,7 @@ static uint32_t seconds_since_midnight(uint8_t hours, uint8_t minutes,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void seconds_since_midnight_into_hms(uint32_t seconds,
|
static void seconds_since_midnight_into_hms(uint32_t seconds,
|
||||||
uint8_t * pHours,
|
uint8_t * pHours, uint8_t * pMinutes, uint8_t * pSeconds)
|
||||||
uint8_t *pMinutes,
|
|
||||||
uint8_t *pSeconds)
|
|
||||||
{
|
{
|
||||||
uint8_t hour = 0;
|
uint8_t hour = 0;
|
||||||
uint8_t minute = 0;
|
uint8_t minute = 0;
|
||||||
@@ -316,14 +305,10 @@ void datetime_add_minutes(BACNET_DATE_TIME * bdatetime, uint32_t minutes)
|
|||||||
uint32_t days = 0;
|
uint32_t days = 0;
|
||||||
|
|
||||||
/* convert bdatetime to seconds and days */
|
/* convert bdatetime to seconds and days */
|
||||||
bdatetime_minutes = seconds_since_midnight(
|
bdatetime_minutes = seconds_since_midnight(bdatetime->time.hour,
|
||||||
bdatetime->time.hour,
|
bdatetime->time.min, bdatetime->time.sec) / 60;
|
||||||
bdatetime->time.min,
|
bdatetime_days = days_since_epoch(bdatetime->date.year,
|
||||||
bdatetime->time.sec) / 60;
|
bdatetime->date.month, bdatetime->date.day);
|
||||||
bdatetime_days = days_since_epoch(
|
|
||||||
bdatetime->date.year,
|
|
||||||
bdatetime->date.month,
|
|
||||||
bdatetime->date.day);
|
|
||||||
|
|
||||||
/* add */
|
/* add */
|
||||||
days = minutes / (24 * 60);
|
days = minutes / (24 * 60);
|
||||||
@@ -335,18 +320,12 @@ void datetime_add_minutes(BACNET_DATE_TIME * bdatetime, uint32_t minutes)
|
|||||||
|
|
||||||
/* convert bdatetime from seconds and days */
|
/* convert bdatetime from seconds and days */
|
||||||
seconds_since_midnight_into_hms(bdatetime_minutes * 60,
|
seconds_since_midnight_into_hms(bdatetime_minutes * 60,
|
||||||
&bdatetime->time.hour,
|
&bdatetime->time.hour, &bdatetime->time.min, &bdatetime->time.sec);
|
||||||
&bdatetime->time.min,
|
days_since_epoch_into_ymd(bdatetime_days,
|
||||||
&bdatetime->time.sec);
|
|
||||||
days_since_epoch_into_ymd(
|
|
||||||
bdatetime_days,
|
|
||||||
&bdatetime->date.year,
|
&bdatetime->date.year,
|
||||||
&bdatetime->date.month,
|
&bdatetime->date.month, &bdatetime->date.day);
|
||||||
&bdatetime->date.day);
|
bdatetime->date.wday = day_of_week(bdatetime->date.year,
|
||||||
bdatetime->date.wday = day_of_week(
|
bdatetime->date.month, bdatetime->date.day);
|
||||||
bdatetime->date.year,
|
|
||||||
bdatetime->date.month,
|
|
||||||
bdatetime->date.day);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef TEST
|
#ifdef TEST
|
||||||
@@ -399,8 +378,9 @@ void testBACnetDateTimeSeconds(Test * pTest)
|
|||||||
seconds = seconds_since_midnight(hour, minute, second);
|
seconds = seconds_since_midnight(hour, minute, second);
|
||||||
seconds_since_midnight_into_hms(seconds,
|
seconds_since_midnight_into_hms(seconds,
|
||||||
&test_hour, &test_minute, &test_second);
|
&test_hour, &test_minute, &test_second);
|
||||||
test_seconds = seconds_since_midnight(
|
test_seconds =
|
||||||
test_hour, test_minute, test_second);
|
seconds_since_midnight(test_hour, test_minute,
|
||||||
|
test_second);
|
||||||
ct_test(pTest, seconds == test_seconds);
|
ct_test(pTest, seconds == test_seconds);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,8 +68,7 @@ extern "C" {
|
|||||||
void datetime_set_time(BACNET_TIME * btime,
|
void datetime_set_time(BACNET_TIME * btime,
|
||||||
uint8_t hour, uint8_t minute, uint8_t seconds, uint8_t hundredths);
|
uint8_t hour, uint8_t minute, uint8_t seconds, uint8_t hundredths);
|
||||||
void datetime_set(BACNET_DATE_TIME * bdatetime,
|
void datetime_set(BACNET_DATE_TIME * bdatetime,
|
||||||
BACNET_DATE * bdate,
|
BACNET_DATE * bdate, BACNET_TIME * btime);
|
||||||
BACNET_TIME * btime);
|
|
||||||
void datetime_set_values(BACNET_DATE_TIME * bdatetime,
|
void datetime_set_values(BACNET_DATE_TIME * bdatetime,
|
||||||
uint16_t year, uint8_t month, uint8_t day,
|
uint16_t year, uint8_t month, uint8_t day,
|
||||||
uint8_t hour, uint8_t minute, uint8_t seconds, uint8_t hundredths);
|
uint8_t hour, uint8_t minute, uint8_t seconds, uint8_t hundredths);
|
||||||
@@ -80,23 +79,20 @@ extern "C" {
|
|||||||
if date1 is after date2, returns positive */
|
if date1 is after date2, returns positive */
|
||||||
int datetime_compare_date(BACNET_DATE * date1, BACNET_DATE * date2);
|
int datetime_compare_date(BACNET_DATE * date1, BACNET_DATE * date2);
|
||||||
int datetime_compare_time(BACNET_TIME * time1, BACNET_TIME * time2);
|
int datetime_compare_time(BACNET_TIME * time1, BACNET_TIME * time2);
|
||||||
int datetime_compare(
|
int datetime_compare(BACNET_DATE_TIME * datetime1,
|
||||||
BACNET_DATE_TIME * datetime1,
|
|
||||||
BACNET_DATE_TIME * datetime2);
|
BACNET_DATE_TIME * datetime2);
|
||||||
|
|
||||||
/* utility copy functions */
|
/* utility copy functions */
|
||||||
void datetime_copy_date(BACNET_DATE * date1, BACNET_DATE * date2);
|
void datetime_copy_date(BACNET_DATE * date1, BACNET_DATE * date2);
|
||||||
void datetime_copy_time(BACNET_TIME * time1, BACNET_TIME * time2);
|
void datetime_copy_time(BACNET_TIME * time1, BACNET_TIME * time2);
|
||||||
void datetime_copy(
|
void datetime_copy(BACNET_DATE_TIME * datetime1,
|
||||||
BACNET_DATE_TIME * datetime1,
|
|
||||||
BACNET_DATE_TIME * datetime2);
|
BACNET_DATE_TIME * datetime2);
|
||||||
|
|
||||||
/* utility add function */
|
/* utility add function */
|
||||||
void datetime_add_minutes(BACNET_DATE_TIME * bdatetime, uint32_t minutes);
|
void datetime_add_minutes(BACNET_DATE_TIME * bdatetime,
|
||||||
|
uint32_t minutes);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
#endif /* DATE_TIME_H */
|
#endif /* DATE_TIME_H */
|
||||||
|
|
||||||
|
|||||||
@@ -54,8 +54,7 @@ static uint8_t Temp_Buf[MAX_APDU] = { 0 };
|
|||||||
|
|
||||||
void handler_read_property(uint8_t * service_request,
|
void handler_read_property(uint8_t * service_request,
|
||||||
uint16_t service_len,
|
uint16_t service_len,
|
||||||
BACNET_ADDRESS * src,
|
BACNET_ADDRESS * src, BACNET_CONFIRMED_SERVICE_DATA * service_data)
|
||||||
BACNET_CONFIRMED_SERVICE_DATA * service_data)
|
|
||||||
{
|
{
|
||||||
BACNET_READ_PROPERTY_DATA data;
|
BACNET_READ_PROPERTY_DATA data;
|
||||||
int len = 0;
|
int len = 0;
|
||||||
|
|||||||
@@ -259,7 +259,8 @@ void handler_write_property(uint8_t * service_request,
|
|||||||
SERVICE_CONFIRMED_WRITE_PROPERTY, error_class,
|
SERVICE_CONFIRMED_WRITE_PROPERTY, error_class,
|
||||||
error_code);
|
error_code);
|
||||||
#if PRINT_ENABLED
|
#if PRINT_ENABLED
|
||||||
fprintf(stderr, "Sending Write Access Error for Load Control!\n");
|
fprintf(stderr,
|
||||||
|
"Sending Write Access Error for Load Control!\n");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -89,7 +89,8 @@ uint8_t Send_Read_Property_Request(uint32_t device_id, /* destination device */
|
|||||||
max_apdu in the address binding table. */
|
max_apdu in the address binding table. */
|
||||||
if ((unsigned) pdu_len < max_apdu) {
|
if ((unsigned) pdu_len < max_apdu) {
|
||||||
tsm_set_confirmed_unsegmented_transaction(invoke_id, &dest,
|
tsm_set_confirmed_unsegmented_transaction(invoke_id, &dest,
|
||||||
&npdu_data, &Handler_Transmit_Buffer[0], (uint16_t)pdu_len);
|
&npdu_data, &Handler_Transmit_Buffer[0],
|
||||||
|
(uint16_t) pdu_len);
|
||||||
bytes_sent =
|
bytes_sent =
|
||||||
datalink_send_pdu(&dest, &npdu_data,
|
datalink_send_pdu(&dest, &npdu_data,
|
||||||
&Handler_Transmit_Buffer[0], pdu_len);
|
&Handler_Transmit_Buffer[0], pdu_len);
|
||||||
|
|||||||
@@ -81,8 +81,8 @@ uint8_t Send_Write_Property_Request(uint32_t device_id, /* destination device */
|
|||||||
data.object_property = object_property;
|
data.object_property = object_property;
|
||||||
data.array_index = array_index;
|
data.array_index = array_index;
|
||||||
data.application_data_len =
|
data.application_data_len =
|
||||||
bacapp_encode_application_data(
|
bacapp_encode_application_data(&data.application_data[0],
|
||||||
&data.application_data[0],object_value);
|
object_value);
|
||||||
data.priority = priority;
|
data.priority = priority;
|
||||||
len = wp_encode_apdu(&Handler_Transmit_Buffer[pdu_len],
|
len = wp_encode_apdu(&Handler_Transmit_Buffer[pdu_len],
|
||||||
invoke_id, &data);
|
invoke_id, &data);
|
||||||
@@ -94,7 +94,8 @@ uint8_t Send_Write_Property_Request(uint32_t device_id, /* destination device */
|
|||||||
max_apdu in the address binding table. */
|
max_apdu in the address binding table. */
|
||||||
if ((unsigned) pdu_len < max_apdu) {
|
if ((unsigned) pdu_len < max_apdu) {
|
||||||
tsm_set_confirmed_unsegmented_transaction(invoke_id, &dest,
|
tsm_set_confirmed_unsegmented_transaction(invoke_id, &dest,
|
||||||
&npdu_data, &Handler_Transmit_Buffer[0], (uint16_t)pdu_len);
|
&npdu_data, &Handler_Transmit_Buffer[0],
|
||||||
|
(uint16_t) pdu_len);
|
||||||
bytes_sent =
|
bytes_sent =
|
||||||
datalink_send_pdu(&dest, &npdu_data,
|
datalink_send_pdu(&dest, &npdu_data,
|
||||||
&Handler_Transmit_Buffer[0], pdu_len);
|
&Handler_Transmit_Buffer[0], pdu_len);
|
||||||
|
|||||||
@@ -285,10 +285,8 @@ bool Analog_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
/* decode the some of the request */
|
/* decode the some of the request */
|
||||||
len = bacapp_decode_application_data(
|
len = bacapp_decode_application_data(wp_data->application_data,
|
||||||
wp_data->application_data,
|
wp_data->application_data_len, &value);
|
||||||
wp_data->application_data_len,
|
|
||||||
&value);
|
|
||||||
/* FIXME: len < application_data_len: more data? */
|
/* FIXME: len < application_data_len: more data? */
|
||||||
/* FIXME: len == 0: unable to decode? */
|
/* FIXME: len == 0: unable to decode? */
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
@@ -300,8 +298,7 @@ bool Analog_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
|
|||||||
object. */
|
object. */
|
||||||
if (priority && (priority <= BACNET_MAX_PRIORITY) &&
|
if (priority && (priority <= BACNET_MAX_PRIORITY) &&
|
||||||
(priority != 6 /* reserved */ ) &&
|
(priority != 6 /* reserved */ ) &&
|
||||||
(value.type.Real >= 0.0) &&
|
(value.type.Real >= 0.0) && (value.type.Real <= 100.0)) {
|
||||||
(value.type.Real <= 100.0)) {
|
|
||||||
level = (uint8_t) value.type.Real;
|
level = (uint8_t) value.type.Real;
|
||||||
object_index =
|
object_index =
|
||||||
Analog_Output_Instance_To_Index(wp_data->
|
Analog_Output_Instance_To_Index(wp_data->
|
||||||
|
|||||||
@@ -282,10 +282,8 @@ bool Analog_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
/* decode the some of the request */
|
/* decode the some of the request */
|
||||||
len = bacapp_decode_application_data(
|
len = bacapp_decode_application_data(wp_data->application_data,
|
||||||
wp_data->application_data,
|
wp_data->application_data_len, &value);
|
||||||
wp_data->application_data_len,
|
|
||||||
&value);
|
|
||||||
/* FIXME: len < application_data_len: more data? */
|
/* FIXME: len < application_data_len: more data? */
|
||||||
/* FIXME: len == 0: unable to decode? */
|
/* FIXME: len == 0: unable to decode? */
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
@@ -297,8 +295,7 @@ bool Analog_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
|
|||||||
object. */
|
object. */
|
||||||
if (priority && (priority <= BACNET_MAX_PRIORITY) &&
|
if (priority && (priority <= BACNET_MAX_PRIORITY) &&
|
||||||
(priority != 6 /* reserved */ ) &&
|
(priority != 6 /* reserved */ ) &&
|
||||||
(value.type.Real >= 0.0) &&
|
(value.type.Real >= 0.0) && (value.type.Real <= 100.0)) {
|
||||||
(value.type.Real <= 100.0)) {
|
|
||||||
level = (uint8_t) value.type.Real;
|
level = (uint8_t) value.type.Real;
|
||||||
object_index =
|
object_index =
|
||||||
Analog_Value_Instance_To_Index(wp_data->
|
Analog_Value_Instance_To_Index(wp_data->
|
||||||
@@ -349,8 +346,7 @@ bool Analog_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
|
|||||||
if (value.tag == BACNET_APPLICATION_TAG_BOOLEAN) {
|
if (value.tag == BACNET_APPLICATION_TAG_BOOLEAN) {
|
||||||
object_index =
|
object_index =
|
||||||
Analog_Value_Instance_To_Index(wp_data->object_instance);
|
Analog_Value_Instance_To_Index(wp_data->object_instance);
|
||||||
Analog_Value_Out_Of_Service[object_index] =
|
Analog_Value_Out_Of_Service[object_index] = value.type.Boolean;
|
||||||
value.type.Boolean;
|
|
||||||
status = true;
|
status = true;
|
||||||
} else {
|
} else {
|
||||||
*error_class = ERROR_CLASS_PROPERTY;
|
*error_class = ERROR_CLASS_PROPERTY;
|
||||||
|
|||||||
@@ -232,10 +232,8 @@ bool bacfile_write_property(BACNET_WRITE_PROPERTY_DATA * wp_data,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* decode the some of the request */
|
/* decode the some of the request */
|
||||||
len = bacapp_decode_application_data(
|
len = bacapp_decode_application_data(wp_data->application_data,
|
||||||
wp_data->application_data,
|
wp_data->application_data_len, &value);
|
||||||
wp_data->application_data_len,
|
|
||||||
&value);
|
|
||||||
/* FIXME: len < application_data_len: more data? */
|
/* FIXME: len < application_data_len: more data? */
|
||||||
/* FIXME: len == 0: unable to decode? */
|
/* FIXME: len == 0: unable to decode? */
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
|
|||||||
@@ -283,10 +283,8 @@ bool Binary_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
/* decode the some of the request */
|
/* decode the some of the request */
|
||||||
len = bacapp_decode_application_data(
|
len = bacapp_decode_application_data(wp_data->application_data,
|
||||||
wp_data->application_data,
|
wp_data->application_data_len, &value);
|
||||||
wp_data->application_data_len,
|
|
||||||
&value);
|
|
||||||
/* FIXME: len < application_data_len: more data? */
|
/* FIXME: len < application_data_len: more data? */
|
||||||
/* FIXME: len == 0: unable to decode? */
|
/* FIXME: len == 0: unable to decode? */
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
|
|||||||
@@ -280,10 +280,8 @@ bool Binary_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
/* decode the some of the request */
|
/* decode the some of the request */
|
||||||
len = bacapp_decode_application_data(
|
len = bacapp_decode_application_data(wp_data->application_data,
|
||||||
wp_data->application_data,
|
wp_data->application_data_len, &value);
|
||||||
wp_data->application_data_len,
|
|
||||||
&value);
|
|
||||||
/* FIXME: len < application_data_len: more data? */
|
/* FIXME: len < application_data_len: more data? */
|
||||||
/* FIXME: len == 0: unable to decode? */
|
/* FIXME: len == 0: unable to decode? */
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
@@ -347,8 +345,7 @@ bool Binary_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
|
|||||||
if (value.tag == BACNET_APPLICATION_TAG_BOOLEAN) {
|
if (value.tag == BACNET_APPLICATION_TAG_BOOLEAN) {
|
||||||
object_index =
|
object_index =
|
||||||
Binary_Value_Instance_To_Index(wp_data->object_instance);
|
Binary_Value_Instance_To_Index(wp_data->object_instance);
|
||||||
Binary_Value_Out_Of_Service[object_index] =
|
Binary_Value_Out_Of_Service[object_index] = value.type.Boolean;
|
||||||
value.type.Boolean;
|
|
||||||
status = true;
|
status = true;
|
||||||
} else {
|
} else {
|
||||||
*error_class = ERROR_CLASS_PROPERTY;
|
*error_class = ERROR_CLASS_PROPERTY;
|
||||||
|
|||||||
@@ -796,18 +796,16 @@ bool Device_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
/* decode the some of the request */
|
/* decode the some of the request */
|
||||||
len = bacapp_decode_application_data(
|
len = bacapp_decode_application_data(wp_data->application_data,
|
||||||
wp_data->application_data,
|
wp_data->application_data_len, &value);
|
||||||
wp_data->application_data_len,
|
|
||||||
&value);
|
|
||||||
/* FIXME: len < application_data_len: more data? */
|
/* FIXME: len < application_data_len: more data? */
|
||||||
/* FIXME: len == 0: unable to decode? */
|
/* FIXME: len == 0: unable to decode? */
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
case PROP_OBJECT_IDENTIFIER:
|
case PROP_OBJECT_IDENTIFIER:
|
||||||
if (value.tag == BACNET_APPLICATION_TAG_OBJECT_ID) {
|
if (value.tag == BACNET_APPLICATION_TAG_OBJECT_ID) {
|
||||||
if ((value.type.Object_Id.type == OBJECT_DEVICE) &&
|
if ((value.type.Object_Id.type == OBJECT_DEVICE) &&
|
||||||
(Device_Set_Object_Instance_Number(
|
(Device_Set_Object_Instance_Number(value.type.Object_Id.
|
||||||
value.type.Object_Id.instance))) {
|
instance))) {
|
||||||
/* FIXME: we could send an I-Am broadcast to let the world know */
|
/* FIXME: we could send an I-Am broadcast to let the world know */
|
||||||
status = true;
|
status = true;
|
||||||
} else {
|
} else {
|
||||||
@@ -835,8 +833,7 @@ bool Device_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
|
|||||||
case PROP_APDU_TIMEOUT:
|
case PROP_APDU_TIMEOUT:
|
||||||
if (value.tag == BACNET_APPLICATION_TAG_UNSIGNED_INT) {
|
if (value.tag == BACNET_APPLICATION_TAG_UNSIGNED_INT) {
|
||||||
/* FIXME: bounds check? */
|
/* FIXME: bounds check? */
|
||||||
Device_Set_APDU_Timeout((uint16_t) value.type.
|
Device_Set_APDU_Timeout((uint16_t) value.type.Unsigned_Int);
|
||||||
Unsigned_Int);
|
|
||||||
status = true;
|
status = true;
|
||||||
} else {
|
} else {
|
||||||
*error_class = ERROR_CLASS_PROPERTY;
|
*error_class = ERROR_CLASS_PROPERTY;
|
||||||
@@ -870,12 +867,11 @@ bool Device_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
|
|||||||
if (value.tag == BACNET_APPLICATION_TAG_CHARACTER_STRING) {
|
if (value.tag == BACNET_APPLICATION_TAG_CHARACTER_STRING) {
|
||||||
uint8_t encoding;
|
uint8_t encoding;
|
||||||
encoding =
|
encoding =
|
||||||
characterstring_encoding(&value.type.
|
characterstring_encoding(&value.type.Character_String);
|
||||||
Character_String);
|
|
||||||
if (encoding == CHARACTER_ANSI_X34) {
|
if (encoding == CHARACTER_ANSI_X34) {
|
||||||
status =
|
status =
|
||||||
Device_Set_Object_Name(
|
Device_Set_Object_Name(characterstring_value(&value.
|
||||||
characterstring_value(&value.type.Character_String),
|
type.Character_String),
|
||||||
characterstring_length(&value.type.Character_String));
|
characterstring_length(&value.type.Character_String));
|
||||||
if (!status) {
|
if (!status) {
|
||||||
*error_class = ERROR_CLASS_PROPERTY;
|
*error_class = ERROR_CLASS_PROPERTY;
|
||||||
|
|||||||
@@ -123,7 +123,8 @@ void Load_Control_Init(void)
|
|||||||
Requested_Shed_Level[i].type = BACNET_SHED_TYPE_LEVEL;
|
Requested_Shed_Level[i].type = BACNET_SHED_TYPE_LEVEL;
|
||||||
Requested_Shed_Level[i].value.level = 0;
|
Requested_Shed_Level[i].value.level = 0;
|
||||||
datetime_set_values(&Start_Time[i], 0, 0, 0, 0, 0, 0, 0);
|
datetime_set_values(&Start_Time[i], 0, 0, 0, 0, 0, 0, 0);
|
||||||
datetime_set_values(&Previous_Start_Time[i],0,0,0,0,0,0,0);
|
datetime_set_values(&Previous_Start_Time[i], 0, 0, 0, 0, 0, 0,
|
||||||
|
0);
|
||||||
Shed_Duration[i] = 0;
|
Shed_Duration[i] = 0;
|
||||||
Duty_Window[i] = 0;
|
Duty_Window[i] = 0;
|
||||||
Load_Control_Enable[i] = true;
|
Load_Control_Enable[i] = true;
|
||||||
@@ -186,7 +187,8 @@ unsigned Load_Control_Instance_To_Index(uint32_t object_instance)
|
|||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BACNET_SHED_STATE Load_Control_Present_Value(uint32_t object_instance)
|
static BACNET_SHED_STATE Load_Control_Present_Value(uint32_t
|
||||||
|
object_instance)
|
||||||
{
|
{
|
||||||
BACNET_SHED_STATE value = BACNET_SHED_INACTIVE;
|
BACNET_SHED_STATE value = BACNET_SHED_INACTIVE;
|
||||||
unsigned index = 0;
|
unsigned index = 0;
|
||||||
@@ -234,19 +236,14 @@ struct tm {
|
|||||||
|
|
||||||
timer = time(NULL);
|
timer = time(NULL);
|
||||||
tblock = localtime(&timer);
|
tblock = localtime(&timer);
|
||||||
datetime_set_values(
|
datetime_set_values(bdatetime,
|
||||||
bdatetime,
|
|
||||||
tblock->tm_year,
|
tblock->tm_year,
|
||||||
tblock->tm_mon,
|
tblock->tm_mon,
|
||||||
tblock->tm_mday,
|
tblock->tm_mday,
|
||||||
tblock->tm_hour,
|
tblock->tm_hour, tblock->tm_min, tblock->tm_sec, 0);
|
||||||
tblock->tm_min,
|
|
||||||
tblock->tm_sec,
|
|
||||||
0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef enum load_control_state
|
typedef enum load_control_state {
|
||||||
{
|
|
||||||
SHED_INACTIVE,
|
SHED_INACTIVE,
|
||||||
SHED_REQUEST_PENDING,
|
SHED_REQUEST_PENDING,
|
||||||
SHED_NON_COMPLIANT,
|
SHED_NON_COMPLIANT,
|
||||||
@@ -267,12 +264,12 @@ void Load_Control_State_Machine(int object_index)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (state[object_index])
|
switch (state[object_index]) {
|
||||||
{
|
|
||||||
case SHED_REQUEST_PENDING:
|
case SHED_REQUEST_PENDING:
|
||||||
Update_Current_Time(&Current_Time);
|
Update_Current_Time(&Current_Time);
|
||||||
datetime_copy(&End_Time[object_index], &Start_Time[object_index]);
|
datetime_copy(&End_Time[object_index], &Start_Time[object_index]);
|
||||||
datetime_add_minutes(&End_Time[object_index], Shed_Duration[object_index]);
|
datetime_add_minutes(&End_Time[object_index],
|
||||||
|
Shed_Duration[object_index]);
|
||||||
diff = datetime_compare(&End_Time[object_index], &Current_Time);
|
diff = datetime_compare(&End_Time[object_index], &Current_Time);
|
||||||
if (diff < 0) {
|
if (diff < 0) {
|
||||||
/* CancelShed */
|
/* CancelShed */
|
||||||
@@ -301,8 +298,7 @@ void Load_Control_State_Machine(int object_index)
|
|||||||
/* FIXME: calculate your Actual Shed Level */
|
/* FIXME: calculate your Actual Shed Level */
|
||||||
Expected_Shed_Level[object_index].type =
|
Expected_Shed_Level[object_index].type =
|
||||||
Requested_Shed_Level[object_index].type;
|
Requested_Shed_Level[object_index].type;
|
||||||
switch (Requested_Shed_Level[object_index].type)
|
switch (Requested_Shed_Level[object_index].type) {
|
||||||
{
|
|
||||||
case BACNET_SHED_TYPE_PERCENT:
|
case BACNET_SHED_TYPE_PERCENT:
|
||||||
Actual_Shed_Level[object_index].value.percent =
|
Actual_Shed_Level[object_index].value.percent =
|
||||||
Expected_Shed_Level[object_index].value.percent =
|
Expected_Shed_Level[object_index].value.percent =
|
||||||
@@ -400,8 +396,7 @@ int Load_Control_Encode_Property_APDU(uint8_t * apdu,
|
|||||||
apdu_len = encode_tagged_enumerated(&apdu[0], EVENT_STATE_NORMAL);
|
apdu_len = encode_tagged_enumerated(&apdu[0], EVENT_STATE_NORMAL);
|
||||||
break;
|
break;
|
||||||
case PROP_REQUESTED_SHED_LEVEL:
|
case PROP_REQUESTED_SHED_LEVEL:
|
||||||
switch (Requested_Shed_Level[object_index].type)
|
switch (Requested_Shed_Level[object_index].type) {
|
||||||
{
|
|
||||||
case BACNET_SHED_TYPE_PERCENT:
|
case BACNET_SHED_TYPE_PERCENT:
|
||||||
apdu_len = encode_context_unsigned(&apdu[0], 0,
|
apdu_len = encode_context_unsigned(&apdu[0], 0,
|
||||||
Requested_Shed_Level[object_index].value.percent);
|
Requested_Shed_Level[object_index].value.percent);
|
||||||
@@ -418,8 +413,7 @@ int Load_Control_Encode_Property_APDU(uint8_t * apdu,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_START_TIME:
|
case PROP_START_TIME:
|
||||||
len = encode_tagged_date(&apdu[0],
|
len = encode_tagged_date(&apdu[0], &Start_Time[object_index].date);
|
||||||
&Start_Time[object_index].date);
|
|
||||||
apdu_len = len;
|
apdu_len = len;
|
||||||
len = encode_tagged_time(&apdu[apdu_len],
|
len = encode_tagged_time(&apdu[apdu_len],
|
||||||
&Start_Time[object_index].time);
|
&Start_Time[object_index].time);
|
||||||
@@ -442,8 +436,7 @@ int Load_Control_Encode_Property_APDU(uint8_t * apdu,
|
|||||||
Full_Duty_Baseline[object_index]);
|
Full_Duty_Baseline[object_index]);
|
||||||
break;
|
break;
|
||||||
case PROP_EXPECTED_SHED_LEVEL:
|
case PROP_EXPECTED_SHED_LEVEL:
|
||||||
switch (Expected_Shed_Level[object_index].type)
|
switch (Expected_Shed_Level[object_index].type) {
|
||||||
{
|
|
||||||
case BACNET_SHED_TYPE_PERCENT:
|
case BACNET_SHED_TYPE_PERCENT:
|
||||||
apdu_len = encode_context_unsigned(&apdu[0], 0,
|
apdu_len = encode_context_unsigned(&apdu[0], 0,
|
||||||
Expected_Shed_Level[object_index].value.percent);
|
Expected_Shed_Level[object_index].value.percent);
|
||||||
@@ -460,8 +453,7 @@ int Load_Control_Encode_Property_APDU(uint8_t * apdu,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_ACTUAL_SHED_LEVEL:
|
case PROP_ACTUAL_SHED_LEVEL:
|
||||||
switch (Actual_Shed_Level[object_index].type)
|
switch (Actual_Shed_Level[object_index].type) {
|
||||||
{
|
|
||||||
case BACNET_SHED_TYPE_PERCENT:
|
case BACNET_SHED_TYPE_PERCENT:
|
||||||
apdu_len = encode_context_unsigned(&apdu[0], 0,
|
apdu_len = encode_context_unsigned(&apdu[0], 0,
|
||||||
Actual_Shed_Level[object_index].value.percent);
|
Actual_Shed_Level[object_index].value.percent);
|
||||||
@@ -480,15 +472,16 @@ int Load_Control_Encode_Property_APDU(uint8_t * apdu,
|
|||||||
case PROP_SHED_LEVELS:
|
case PROP_SHED_LEVELS:
|
||||||
/* Array element zero is the number of elements in the array */
|
/* Array element zero is the number of elements in the array */
|
||||||
if (array_index == BACNET_ARRAY_LENGTH_INDEX)
|
if (array_index == BACNET_ARRAY_LENGTH_INDEX)
|
||||||
apdu_len =
|
apdu_len = encode_tagged_unsigned(&apdu[0], MAX_SHED_LEVELS);
|
||||||
encode_tagged_unsigned(&apdu[0], MAX_SHED_LEVELS);
|
|
||||||
/* if no index was specified, then try to encode the entire list */
|
/* if no index was specified, then try to encode the entire list */
|
||||||
/* into one packet. */
|
/* into one packet. */
|
||||||
else if (array_index == BACNET_ARRAY_ALL) {
|
else if (array_index == BACNET_ARRAY_ALL) {
|
||||||
apdu_len = 0;
|
apdu_len = 0;
|
||||||
for (i = 0; i < MAX_SHED_LEVELS; i++) {
|
for (i = 0; i < MAX_SHED_LEVELS; i++) {
|
||||||
/* FIXME: check if we have room before adding it to APDU */
|
/* FIXME: check if we have room before adding it to APDU */
|
||||||
len = encode_tagged_unsigned(&apdu[apdu_len], Shed_Levels[object_index][i]);
|
len =
|
||||||
|
encode_tagged_unsigned(&apdu[apdu_len],
|
||||||
|
Shed_Levels[object_index][i]);
|
||||||
/* add it if we have room */
|
/* add it if we have room */
|
||||||
if ((apdu_len + len) < MAX_APDU)
|
if ((apdu_len + len) < MAX_APDU)
|
||||||
apdu_len += len;
|
apdu_len += len;
|
||||||
@@ -513,8 +506,7 @@ int Load_Control_Encode_Property_APDU(uint8_t * apdu,
|
|||||||
case PROP_SHED_LEVEL_DESCRIPTIONS:
|
case PROP_SHED_LEVEL_DESCRIPTIONS:
|
||||||
/* Array element zero is the number of elements in the array */
|
/* Array element zero is the number of elements in the array */
|
||||||
if (array_index == BACNET_ARRAY_LENGTH_INDEX)
|
if (array_index == BACNET_ARRAY_LENGTH_INDEX)
|
||||||
apdu_len =
|
apdu_len = encode_tagged_unsigned(&apdu[0], MAX_SHED_LEVELS);
|
||||||
encode_tagged_unsigned(&apdu[0], MAX_SHED_LEVELS);
|
|
||||||
/* if no index was specified, then try to encode the entire list */
|
/* if no index was specified, then try to encode the entire list */
|
||||||
/* into one packet. */
|
/* into one packet. */
|
||||||
else if (array_index == BACNET_ARRAY_ALL) {
|
else if (array_index == BACNET_ARRAY_ALL) {
|
||||||
@@ -574,17 +566,15 @@ bool Load_Control_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
/* decode the some of the request */
|
/* decode the some of the request */
|
||||||
len = bacapp_decode_application_data(
|
len = bacapp_decode_application_data(wp_data->application_data,
|
||||||
wp_data->application_data,
|
wp_data->application_data_len, &value);
|
||||||
wp_data->application_data_len,
|
|
||||||
&value);
|
|
||||||
/* FIXME: len < application_data_len: more data? */
|
/* FIXME: len < application_data_len: more data? */
|
||||||
/* FIXME: len == 0: unable to decode? */
|
/* FIXME: len == 0: unable to decode? */
|
||||||
object_index = Load_Control_Instance_To_Index(wp_data->object_instance);
|
object_index =
|
||||||
|
Load_Control_Instance_To_Index(wp_data->object_instance);
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
case PROP_REQUESTED_SHED_LEVEL:
|
case PROP_REQUESTED_SHED_LEVEL:
|
||||||
len = bacapp_decode_context_data(
|
len = bacapp_decode_context_data(wp_data->application_data,
|
||||||
wp_data->application_data,
|
|
||||||
wp_data->application_data_len,
|
wp_data->application_data_len,
|
||||||
&value, PROP_REQUESTED_SHED_LEVEL);
|
&value, PROP_REQUESTED_SHED_LEVEL);
|
||||||
if (value.tag == 0) {
|
if (value.tag == 0) {
|
||||||
@@ -619,10 +609,9 @@ bool Load_Control_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
|
|||||||
}
|
}
|
||||||
if (!status)
|
if (!status)
|
||||||
break;
|
break;
|
||||||
len = bacapp_decode_application_data(
|
len =
|
||||||
wp_data->application_data + len,
|
bacapp_decode_application_data(wp_data->application_data + len,
|
||||||
wp_data->application_data_len - len,
|
wp_data->application_data_len - len, &value);
|
||||||
&value);
|
|
||||||
if (len && value.tag == BACNET_APPLICATION_TAG_TIME) {
|
if (len && value.tag == BACNET_APPLICATION_TAG_TIME) {
|
||||||
memcpy(&Start_Time[object_index].time,
|
memcpy(&Start_Time[object_index].time,
|
||||||
&value.type.Time, sizeof(value.type.Time));
|
&value.type.Time, sizeof(value.type.Time));
|
||||||
@@ -635,8 +624,7 @@ bool Load_Control_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
|
|||||||
break;
|
break;
|
||||||
case PROP_SHED_DURATION:
|
case PROP_SHED_DURATION:
|
||||||
if (value.tag == BACNET_APPLICATION_TAG_UNSIGNED_INT) {
|
if (value.tag == BACNET_APPLICATION_TAG_UNSIGNED_INT) {
|
||||||
Shed_Duration[object_index] =
|
Shed_Duration[object_index] = value.type.Unsigned_Int;
|
||||||
value.type.Unsigned_Int;
|
|
||||||
status = true;
|
status = true;
|
||||||
} else {
|
} else {
|
||||||
*error_class = ERROR_CLASS_PROPERTY;
|
*error_class = ERROR_CLASS_PROPERTY;
|
||||||
@@ -645,8 +633,7 @@ bool Load_Control_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
|
|||||||
break;
|
break;
|
||||||
case PROP_DUTY_WINDOW:
|
case PROP_DUTY_WINDOW:
|
||||||
if (value.tag == BACNET_APPLICATION_TAG_UNSIGNED_INT) {
|
if (value.tag == BACNET_APPLICATION_TAG_UNSIGNED_INT) {
|
||||||
Duty_Window[object_index] =
|
Duty_Window[object_index] = value.type.Unsigned_Int;
|
||||||
value.type.Unsigned_Int;
|
|
||||||
status = true;
|
status = true;
|
||||||
} else {
|
} else {
|
||||||
*error_class = ERROR_CLASS_PROPERTY;
|
*error_class = ERROR_CLASS_PROPERTY;
|
||||||
@@ -659,12 +646,10 @@ bool Load_Control_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
|
|||||||
if (wp_data->array_index == 0) {
|
if (wp_data->array_index == 0) {
|
||||||
*error_class = ERROR_CLASS_PROPERTY;
|
*error_class = ERROR_CLASS_PROPERTY;
|
||||||
*error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
|
*error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
|
||||||
}
|
} else if (wp_data->array_index == BACNET_ARRAY_ALL) {
|
||||||
else if (wp_data->array_index == BACNET_ARRAY_ALL) {
|
|
||||||
/* FIXME: write entire array */
|
/* FIXME: write entire array */
|
||||||
status = true;
|
status = true;
|
||||||
}
|
} else if (wp_data->array_index <= MAX_SHED_LEVELS) {
|
||||||
else if (wp_data->array_index <= MAX_SHED_LEVELS) {
|
|
||||||
Shed_Levels[object_index][wp_data->array_index - 1] =
|
Shed_Levels[object_index][wp_data->array_index - 1] =
|
||||||
value.type.Unsigned_Int;
|
value.type.Unsigned_Int;
|
||||||
status = true;
|
status = true;
|
||||||
@@ -677,8 +662,7 @@ bool Load_Control_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
|
|||||||
break;
|
break;
|
||||||
case PROP_ENABLE:
|
case PROP_ENABLE:
|
||||||
if (value.tag == BACNET_APPLICATION_TAG_BOOLEAN) {
|
if (value.tag == BACNET_APPLICATION_TAG_BOOLEAN) {
|
||||||
Load_Control_Enable[object_index] =
|
Load_Control_Enable[object_index] = value.type.Boolean;
|
||||||
value.type.Boolean;
|
|
||||||
status = true;
|
status = true;
|
||||||
} else {
|
} else {
|
||||||
*error_class = ERROR_CLASS_PROPERTY;
|
*error_class = ERROR_CLASS_PROPERTY;
|
||||||
|
|||||||
@@ -254,10 +254,8 @@ bool Life_Safety_Point_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
|
|||||||
*error_code = ERROR_CODE_UNKNOWN_OBJECT;
|
*error_code = ERROR_CODE_UNKNOWN_OBJECT;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
/* decode the some of the request */
|
/* decode the some of the request */
|
||||||
len = bacapp_decode_application_data(
|
len = bacapp_decode_application_data(wp_data->application_data,
|
||||||
wp_data->application_data,
|
|
||||||
wp_data->application_data_len,
|
|
||||||
wp_data->application_data_len, &value);
|
wp_data->application_data_len, &value);
|
||||||
/* FIXME: len < application_data_len: more data? */
|
/* FIXME: len < application_data_len: more data? */
|
||||||
/* FIXME: len == 0: unable to decode? */
|
/* FIXME: len == 0: unable to decode? */
|
||||||
|
|||||||
@@ -237,15 +237,15 @@ int Multistate_Output_Encode_Property_APDU(uint8_t * apdu,
|
|||||||
object_index =
|
object_index =
|
||||||
Multistate_Output_Instance_To_Index(object_instance);
|
Multistate_Output_Instance_To_Index(object_instance);
|
||||||
if (array_index <= BACNET_MAX_PRIORITY) {
|
if (array_index <= BACNET_MAX_PRIORITY) {
|
||||||
if (Multistate_Output_Level[object_index][array_index-1] ==
|
if (Multistate_Output_Level[object_index][array_index -
|
||||||
MULTISTATE_NULL)
|
1] == MULTISTATE_NULL)
|
||||||
apdu_len = encode_tagged_null(&apdu[0]);
|
apdu_len = encode_tagged_null(&apdu[0]);
|
||||||
else {
|
else {
|
||||||
present_value =
|
present_value =
|
||||||
Multistate_Output_Level[object_index][array_index-1];
|
Multistate_Output_Level[object_index][array_index -
|
||||||
|
1];
|
||||||
apdu_len =
|
apdu_len =
|
||||||
encode_tagged_unsigned(&apdu[0],
|
encode_tagged_unsigned(&apdu[0], present_value);
|
||||||
present_value);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
*error_class = ERROR_CLASS_PROPERTY;
|
*error_class = ERROR_CLASS_PROPERTY;
|
||||||
@@ -292,10 +292,8 @@ bool Multistate_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
/* decode the some of the request */
|
/* decode the some of the request */
|
||||||
len = bacapp_decode_application_data(
|
len = bacapp_decode_application_data(wp_data->application_data,
|
||||||
wp_data->application_data,
|
wp_data->application_data_len, &value);
|
||||||
wp_data->application_data_len,
|
|
||||||
&value);
|
|
||||||
/* FIXME: len < application_data_len: more data? */
|
/* FIXME: len < application_data_len: more data? */
|
||||||
/* FIXME: len == 0: unable to decode? */
|
/* FIXME: len == 0: unable to decode? */
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
@@ -307,14 +305,14 @@ bool Multistate_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
|
|||||||
object. */
|
object. */
|
||||||
if (priority && (priority <= BACNET_MAX_PRIORITY) &&
|
if (priority && (priority <= BACNET_MAX_PRIORITY) &&
|
||||||
(priority != 6 /* reserved */ ) &&
|
(priority != 6 /* reserved */ ) &&
|
||||||
(value.type.Unsigned_Int <=
|
(value.type.Unsigned_Int <= MULTISTATE_NUMBER_OF_STATES)) {
|
||||||
MULTISTATE_NUMBER_OF_STATES)) {
|
|
||||||
level = value.type.Unsigned_Int;
|
level = value.type.Unsigned_Int;
|
||||||
object_index =
|
object_index =
|
||||||
Multistate_Output_Instance_To_Index(wp_data->
|
Multistate_Output_Instance_To_Index(wp_data->
|
||||||
object_instance);
|
object_instance);
|
||||||
priority--;
|
priority--;
|
||||||
Multistate_Output_Level[object_index][priority] = (uint8_t)level;
|
Multistate_Output_Level[object_index][priority] =
|
||||||
|
(uint8_t) level;
|
||||||
/* Note: you could set the physical output here if we
|
/* Note: you could set the physical output here if we
|
||||||
are the highest priority.
|
are the highest priority.
|
||||||
However, if Out of Service is TRUE, then don't set the
|
However, if Out of Service is TRUE, then don't set the
|
||||||
@@ -339,7 +337,8 @@ bool Multistate_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
|
|||||||
priority = wp_data->priority;
|
priority = wp_data->priority;
|
||||||
if (priority && (priority <= BACNET_MAX_PRIORITY)) {
|
if (priority && (priority <= BACNET_MAX_PRIORITY)) {
|
||||||
priority--;
|
priority--;
|
||||||
Multistate_Output_Level[object_index][priority] = (uint8_t)level;
|
Multistate_Output_Level[object_index][priority] =
|
||||||
|
(uint8_t) level;
|
||||||
/* Note: you could set the physical output here to the next
|
/* Note: you could set the physical output here to the next
|
||||||
highest priority, or to the relinquish default if no
|
highest priority, or to the relinquish default if no
|
||||||
priorities are set.
|
priorities are set.
|
||||||
|
|||||||
@@ -227,7 +227,8 @@ int main(int argc, char *argv[])
|
|||||||
"%s 123 1 0 85 4 100\r\n"
|
"%s 123 1 0 85 4 100\r\n"
|
||||||
"You could also send a relinquish command:\r\n"
|
"You could also send a relinquish command:\r\n"
|
||||||
"%s 123 1 0 85 0 0\r\n",
|
"%s 123 1 0 85 0 0\r\n",
|
||||||
filename_remove_path(argv[0]), filename_remove_path(argv[0]));
|
filename_remove_path(argv[0]),
|
||||||
|
filename_remove_path(argv[0]));
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-5
@@ -218,11 +218,8 @@ void testIAm(Test * pTest)
|
|||||||
|
|
||||||
#ifdef TEST_IAM
|
#ifdef TEST_IAM
|
||||||
/* dummy function stubs */
|
/* dummy function stubs */
|
||||||
int datalink_send_pdu(
|
int datalink_send_pdu(BACNET_ADDRESS * dest,
|
||||||
BACNET_ADDRESS * dest,
|
BACNET_NPDU_DATA * npdu_data, uint8_t * pdu, unsigned pdu_len)
|
||||||
BACNET_NPDU_DATA * npdu_data,
|
|
||||||
uint8_t * pdu,
|
|
||||||
unsigned pdu_len)
|
|
||||||
{
|
{
|
||||||
(void) dest;
|
(void) dest;
|
||||||
(void) npdu_data;
|
(void) npdu_data;
|
||||||
|
|||||||
+2
-1
@@ -337,7 +337,8 @@ void npdu_handler(BACNET_ADDRESS * src, /* source address */
|
|||||||
} else if ((apdu_offset > 0) && (apdu_offset <= pdu_len)) {
|
} else if ((apdu_offset > 0) && (apdu_offset <= pdu_len)) {
|
||||||
/* only handle the version that we know how to handle */
|
/* only handle the version that we know how to handle */
|
||||||
if (npdu_data.protocol_version == BACNET_PROTOCOL_VERSION)
|
if (npdu_data.protocol_version == BACNET_PROTOCOL_VERSION)
|
||||||
apdu_handler(src, &pdu[apdu_offset], (uint16_t)(pdu_len - apdu_offset));
|
apdu_handler(src, &pdu[apdu_offset],
|
||||||
|
(uint16_t) (pdu_len - apdu_offset));
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -78,8 +78,7 @@ bool Device_Set_Object_Instance_Number(uint32_t object_id)
|
|||||||
{
|
{
|
||||||
bool status = true; /* return value */
|
bool status = true; /* return value */
|
||||||
|
|
||||||
if (object_id <= BACNET_MAX_INSTANCE)
|
if (object_id <= BACNET_MAX_INSTANCE) {
|
||||||
{
|
|
||||||
Object_Instance_Number = object_id;
|
Object_Instance_Number = object_id;
|
||||||
/* FIXME: Write the data to the eeprom */
|
/* FIXME: Write the data to the eeprom */
|
||||||
/* I2C_Write_Block(
|
/* I2C_Write_Block(
|
||||||
@@ -87,8 +86,7 @@ bool Device_Set_Object_Instance_Number(uint32_t object_id)
|
|||||||
(char *)&Object_Instance_Number,
|
(char *)&Object_Instance_Number,
|
||||||
sizeof(Object_Instance_Number),
|
sizeof(Object_Instance_Number),
|
||||||
EEPROM_BACNET_ID_ADDR); */
|
EEPROM_BACNET_ID_ADDR); */
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
status = false;
|
status = false;
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
@@ -271,7 +269,8 @@ int Device_Encode_Property_APDU(uint8_t * apdu,
|
|||||||
apdu_len = encode_tagged_character_string(&apdu[0], &char_string);
|
apdu_len = encode_tagged_character_string(&apdu[0], &char_string);
|
||||||
break;
|
break;
|
||||||
case PROP_SYSTEM_STATUS:
|
case PROP_SYSTEM_STATUS:
|
||||||
apdu_len = encode_tagged_enumerated(&apdu[0], Device_System_Status());
|
apdu_len =
|
||||||
|
encode_tagged_enumerated(&apdu[0], Device_System_Status());
|
||||||
break;
|
break;
|
||||||
case PROP_VENDOR_NAME:
|
case PROP_VENDOR_NAME:
|
||||||
(void) strcpypgm2ram(&string_buffer[0], "ASHRAE");
|
(void) strcpypgm2ram(&string_buffer[0], "ASHRAE");
|
||||||
@@ -279,7 +278,8 @@ int Device_Encode_Property_APDU(uint8_t * apdu,
|
|||||||
apdu_len = encode_tagged_character_string(&apdu[0], &char_string);
|
apdu_len = encode_tagged_character_string(&apdu[0], &char_string);
|
||||||
break;
|
break;
|
||||||
case PROP_VENDOR_IDENTIFIER:
|
case PROP_VENDOR_IDENTIFIER:
|
||||||
apdu_len = encode_tagged_unsigned(&apdu[0], Device_Vendor_Identifier());
|
apdu_len =
|
||||||
|
encode_tagged_unsigned(&apdu[0], Device_Vendor_Identifier());
|
||||||
break;
|
break;
|
||||||
case PROP_MODEL_NAME:
|
case PROP_MODEL_NAME:
|
||||||
(void) strcpypgm2ram(&string_buffer[0], "GNU Demo");
|
(void) strcpypgm2ram(&string_buffer[0], "GNU Demo");
|
||||||
@@ -399,16 +399,19 @@ int Device_Encode_Property_APDU(uint8_t * apdu,
|
|||||||
break;
|
break;
|
||||||
case PROP_NUMBER_OF_APDU_RETRIES:
|
case PROP_NUMBER_OF_APDU_RETRIES:
|
||||||
apdu_len =
|
apdu_len =
|
||||||
encode_tagged_unsigned(&apdu[0], Device_Number_Of_APDU_Retries());
|
encode_tagged_unsigned(&apdu[0],
|
||||||
|
Device_Number_Of_APDU_Retries());
|
||||||
break;
|
break;
|
||||||
case PROP_DEVICE_ADDRESS_BINDING:
|
case PROP_DEVICE_ADDRESS_BINDING:
|
||||||
/* FIXME: encode the list here, if it exists */
|
/* FIXME: encode the list here, if it exists */
|
||||||
break;
|
break;
|
||||||
case PROP_DATABASE_REVISION:
|
case PROP_DATABASE_REVISION:
|
||||||
apdu_len = encode_tagged_unsigned(&apdu[0], Device_Database_Revision());
|
apdu_len =
|
||||||
|
encode_tagged_unsigned(&apdu[0], Device_Database_Revision());
|
||||||
break;
|
break;
|
||||||
case PROP_MAX_INFO_FRAMES:
|
case PROP_MAX_INFO_FRAMES:
|
||||||
apdu_len = encode_tagged_unsigned(&apdu[0], dlmstp_max_info_frames());
|
apdu_len =
|
||||||
|
encode_tagged_unsigned(&apdu[0], dlmstp_max_info_frames());
|
||||||
break;
|
break;
|
||||||
case PROP_MAX_MASTER:
|
case PROP_MAX_MASTER:
|
||||||
apdu_len = encode_tagged_unsigned(&apdu[0], dlmstp_max_master());
|
apdu_len = encode_tagged_unsigned(&apdu[0], dlmstp_max_master());
|
||||||
@@ -463,10 +466,8 @@ bool Device_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
/* decode the some of the request */
|
/* decode the some of the request */
|
||||||
len = bacapp_decode_application_data(
|
len = bacapp_decode_application_data(wp_data->application_data,
|
||||||
wp_data->application_data,
|
wp_data->application_data_len, &value);
|
||||||
wp_data->application_data_len,
|
|
||||||
&value);
|
|
||||||
/* FIXME: len < application_data_len: more data? */
|
/* FIXME: len < application_data_len: more data? */
|
||||||
/* FIXME: len == 0: unable to decode? */
|
/* FIXME: len == 0: unable to decode? */
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
@@ -564,4 +565,3 @@ bool Device_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
|
|||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -35,7 +35,7 @@
|
|||||||
#include "rs485.h"
|
#include "rs485.h"
|
||||||
#include "npdu.h"
|
#include "npdu.h"
|
||||||
|
|
||||||
// Number of MS/TP Packets Rx/Tx
|
/* Number of MS/TP Packets Rx/Tx
|
||||||
*/
|
*/
|
||||||
uint16_t MSTP_Packets = 0;
|
uint16_t MSTP_Packets = 0;
|
||||||
|
|
||||||
@@ -49,7 +49,7 @@ volatile struct mstp_port_struct_t MSTP_Port;
|
|||||||
#pragma udata
|
#pragma udata
|
||||||
|
|
||||||
#define INCREMENT_AND_LIMIT_UINT16(x) {if (x < 0xFFFF) x++;}
|
#define INCREMENT_AND_LIMIT_UINT16(x) {if (x < 0xFFFF) x++;}
|
||||||
// This defines the number of edit fields for this module
|
|
||||||
/* This defines the number of edit fields for this module
|
/* This defines the number of edit fields for this module
|
||||||
*/
|
*/
|
||||||
#define MAX_EDIT_FIELD 1
|
#define MAX_EDIT_FIELD 1
|
||||||
@@ -59,22 +59,17 @@ static uint8_t EditField = 0;
|
|||||||
EditField
|
EditField
|
||||||
RETURN: none
|
RETURN: none
|
||||||
ALGORITHM: none
|
ALGORITHM: none
|
||||||
void dlmstp_SetEditField(
|
NOTES: Pass a #>0 to increment #<0 to decrement
|
||||||
signed char state) /* direction our editfield is moving */
|
*************************************************************************** */
|
||||||
{
|
void dlmstp_SetEditField(signed char state)
|
||||||
if (state > 0)
|
|
||||||
{
|
|
||||||
{ /* direction our editfield is moving */
|
{ /* direction our editfield is moving */
|
||||||
if (state > 0) {
|
if (state > 0) {
|
||||||
}
|
if (++EditField > MAX_EDIT_FIELD)
|
||||||
else if (state < 0)
|
|
||||||
{
|
|
||||||
EditField = 0;
|
EditField = 0;
|
||||||
} else if (state < 0) {
|
} else if (state < 0) {
|
||||||
if (EditField)
|
if (EditField)
|
||||||
EditField--;
|
EditField--;
|
||||||
}
|
else
|
||||||
else
|
|
||||||
EditField = MAX_EDIT_FIELD;
|
EditField = MAX_EDIT_FIELD;
|
||||||
} else
|
} else
|
||||||
EditField = 0;
|
EditField = 0;
|
||||||
@@ -179,8 +174,7 @@ int dlmstp_send_pdu(BACNET_ADDRESS * dest, /* destination address */
|
|||||||
}
|
}
|
||||||
bytes_sent = MSTP_Create_Frame(
|
bytes_sent = MSTP_Create_Frame(
|
||||||
(uint8_t *) & MSTP_Port.TxBuffer[0],
|
(uint8_t *) & MSTP_Port.TxBuffer[0],
|
||||||
destination,
|
sizeof(MSTP_Port.TxBuffer),
|
||||||
MSTP_Port.This_Station, pdu, pdu_len);
|
|
||||||
MSTP_Port.TxFrameType,
|
MSTP_Port.TxFrameType,
|
||||||
destination, MSTP_Port.This_Station, pdu, pdu_len);
|
destination, MSTP_Port.This_Station, pdu, pdu_len);
|
||||||
MSTP_Port.TxLength = bytes_sent;
|
MSTP_Port.TxLength = bytes_sent;
|
||||||
@@ -196,8 +190,7 @@ void dlmstp_task(void)
|
|||||||
uint8_t bytes_remaining;
|
uint8_t bytes_remaining;
|
||||||
bool received_frame;
|
bool received_frame;
|
||||||
|
|
||||||
(MSTP_Port.ReceivedInvalidFrame == false))
|
/* only do receive state machine while we don't have a frame */
|
||||||
{
|
|
||||||
if ((MSTP_Port.ReceivedValidFrame == false) &&
|
if ((MSTP_Port.ReceivedValidFrame == false) &&
|
||||||
(MSTP_Port.ReceivedInvalidFrame == false)) {
|
(MSTP_Port.ReceivedInvalidFrame == false)) {
|
||||||
do {
|
do {
|
||||||
@@ -209,18 +202,17 @@ void dlmstp_task(void)
|
|||||||
break;
|
break;
|
||||||
} while (bytes_remaining);
|
} while (bytes_remaining);
|
||||||
}
|
}
|
||||||
while (MSTP_Master_Node_FSM(&MSTP_Port)) {};
|
/* only do master state machine while rx is idle */
|
||||||
//MSTP_Master_Node_FSM(&MSTP_Port);
|
if (MSTP_Port.receive_state == MSTP_RECEIVE_STATE_IDLE) {
|
||||||
|
while (MSTP_Master_Node_FSM(&MSTP_Port)) {
|
||||||
};
|
};
|
||||||
/*MSTP_Master_Node_FSM(&MSTP_Port);
|
/*MSTP_Master_Node_FSM(&MSTP_Port);
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
/* see if there is a packet available, and a place
|
/* see if there is a packet available, and a place
|
||||||
to put the reply (if necessary) and process it */
|
to put the reply (if necessary) and process it */
|
||||||
npdu_handler(
|
if (Receive_Buffer.ready && !MSTP_Port.TxReady) {
|
||||||
&Receive_Buffer.address,
|
if (Receive_Buffer.pdu_len) {
|
||||||
&Receive_Buffer.pdu[0],
|
|
||||||
Receive_Buffer.pdu_len);
|
|
||||||
MSTP_Packets++;
|
MSTP_Packets++;
|
||||||
npdu_handler(&Receive_Buffer.address,
|
npdu_handler(&Receive_Buffer.address,
|
||||||
&Receive_Buffer.pdu[0], Receive_Buffer.pdu_len);
|
&Receive_Buffer.pdu[0], Receive_Buffer.pdu_len);
|
||||||
@@ -252,11 +244,10 @@ void dlmstp_fill_bacnet_address(BACNET_ADDRESS * src, uint8_t mstp_address)
|
|||||||
for (i = 0; i < MAX_MAC_LEN; i++) {
|
for (i = 0; i < MAX_MAC_LEN; i++) {
|
||||||
src->adr[i] = 0;
|
src->adr[i] = 0;
|
||||||
}
|
}
|
||||||
uint16_t dlmstp_put_receive(
|
}
|
||||||
uint8_t src, /* source MS/TP address */
|
|
||||||
|
|
||||||
uint16_t pdu_len) /* amount of PDU data */
|
/* for the MS/TP state machine to use for putting received data */
|
||||||
{
|
uint16_t dlmstp_put_receive(uint8_t src, /* source MS/TP address */
|
||||||
uint8_t * pdu, /* PDU data */
|
uint8_t * pdu, /* PDU data */
|
||||||
uint16_t pdu_len)
|
uint16_t pdu_len)
|
||||||
{ /* amount of PDU data */
|
{ /* amount of PDU data */
|
||||||
|
|||||||
@@ -121,10 +121,8 @@
|
|||||||
#define CLICK() Hardware_Sound_Piezo(SHORT_BEEP);
|
#define CLICK() Hardware_Sound_Piezo(SHORT_BEEP);
|
||||||
#define BEEP() Hardware_Sound_Piezo(LONG_BEEP);
|
#define BEEP() Hardware_Sound_Piezo(LONG_BEEP);
|
||||||
|
|
||||||
typedef union
|
typedef union {
|
||||||
{
|
struct {
|
||||||
struct
|
|
||||||
{
|
|
||||||
uint8_t:1;
|
uint8_t:1;
|
||||||
uint8_t:1;
|
uint8_t:1;
|
||||||
uint8_t Thursday:1;
|
uint8_t Thursday:1;
|
||||||
@@ -179,8 +177,7 @@ typedef union
|
|||||||
uint8_t Saturday:1;
|
uint8_t Saturday:1;
|
||||||
uint8_t Friday:1;
|
uint8_t Friday:1;
|
||||||
};
|
};
|
||||||
struct
|
struct {
|
||||||
{
|
|
||||||
uint8_t row1;
|
uint8_t row1;
|
||||||
uint8_t row2;
|
uint8_t row2;
|
||||||
uint8_t row3;
|
uint8_t row3;
|
||||||
@@ -190,10 +187,8 @@ typedef union
|
|||||||
};
|
};
|
||||||
} LED_REGS;
|
} LED_REGS;
|
||||||
|
|
||||||
union SWITCH_REGS
|
union SWITCH_REGS {
|
||||||
{
|
struct {
|
||||||
struct
|
|
||||||
{
|
|
||||||
uint8_t All_On:1;
|
uint8_t All_On:1;
|
||||||
uint8_t All_Off:1;
|
uint8_t All_Off:1;
|
||||||
uint8_t Addr:4;
|
uint8_t Addr:4;
|
||||||
@@ -265,4 +260,3 @@ extern uint8_t Piezo_Timer;
|
|||||||
extern volatile bool DataPortLocked;
|
extern volatile bool DataPortLocked;
|
||||||
|
|
||||||
#endif /* HARDWARE_H */
|
#endif /* HARDWARE_H */
|
||||||
|
|
||||||
|
|||||||
@@ -46,40 +46,30 @@ void INT0_Interrupt(void);
|
|||||||
void InterruptVectorHigh(void)
|
void InterruptVectorHigh(void)
|
||||||
{
|
{
|
||||||
_asm goto InterruptHandlerHigh /* jump to interrupt routine */
|
_asm goto InterruptHandlerHigh /* jump to interrupt routine */
|
||||||
_endasm
|
_endasm}
|
||||||
}
|
|
||||||
#pragma code
|
#pragma code
|
||||||
|
|
||||||
#pragma code InterruptVectorLow = 0x318
|
#pragma code InterruptVectorLow = 0x318
|
||||||
void InterruptVectorLow(void)
|
void InterruptVectorLow(void)
|
||||||
{
|
{
|
||||||
_asm goto InterruptHandlerLow /* jump to interrupt routine */
|
_asm goto InterruptHandlerLow /* jump to interrupt routine */
|
||||||
_endasm
|
_endasm}
|
||||||
}
|
|
||||||
#pragma code
|
#pragma code
|
||||||
|
|
||||||
#pragma interrupt InterruptHandlerHigh
|
#pragma interrupt InterruptHandlerHigh
|
||||||
void InterruptHandlerHigh(void)
|
void InterruptHandlerHigh(void)
|
||||||
{
|
{
|
||||||
#if 0
|
#if 0
|
||||||
/* check for USART Rx int */
|
/* check for USART Rx int */
|
||||||
if ((PIR1bits.RCIF) && (PIE1bits.RCIE))
|
if ((PIR1bits.RCIF) && (PIE1bits.RCIE)) {
|
||||||
{
|
if ((RCSTA1bits.FERR) || (RCSTA1bits.OERR)) {
|
||||||
if ((RCSTA1bits.FERR) || (RCSTA1bits.OERR))
|
|
||||||
{
|
|
||||||
Comstat.Rx_Bufferoverrun = TRUE;
|
Comstat.Rx_Bufferoverrun = TRUE;
|
||||||
PIE1bits.RC1IE = 0; /* Disable Interrupt on receipt */
|
PIE1bits.RC1IE = 0; /* Disable Interrupt on receipt */
|
||||||
}
|
} else if (Comstat.Rx_Bytes++ < RX_BUFFER_SIZE - 1) {
|
||||||
else if (Comstat.Rx_Bytes++ < RX_BUFFER_SIZE - 1)
|
|
||||||
{
|
|
||||||
Rx_Buffer[Comstat.RxHead++] = RCREG1;
|
Rx_Buffer[Comstat.RxHead++] = RCREG1;
|
||||||
|
|
||||||
/* Stick a Null on the end to let us use str functions on our
|
/* Stick a Null on the end to let us use str functions on our
|
||||||
* buffer */
|
* buffer */
|
||||||
Rx_Buffer[Comstat.RxHead] = 0;
|
Rx_Buffer[Comstat.RxHead] = 0;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
Comstat.Rx_Bufferoverrun = TRUE;
|
Comstat.Rx_Bufferoverrun = TRUE;
|
||||||
PIE1bits.RC1IE = 0; /* Disable Interrupt on receipt */
|
PIE1bits.RC1IE = 0; /* Disable Interrupt on receipt */
|
||||||
}
|
}
|
||||||
@@ -87,8 +77,7 @@ void InterruptHandlerHigh (void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* check for timer0 int */
|
/* check for timer0 int */
|
||||||
if ((INTCONbits.TMR0IF) && (INTCONbits.TMR0IE))
|
if ((INTCONbits.TMR0IF) && (INTCONbits.TMR0IE)) {
|
||||||
{
|
|
||||||
INTCONbits.TMR0IF = 0;
|
INTCONbits.TMR0IF = 0;
|
||||||
System_Seconds++;
|
System_Seconds++;
|
||||||
}
|
}
|
||||||
@@ -100,43 +89,37 @@ void InterruptHandlerHigh (void)
|
|||||||
void InterruptHandlerLow(void)
|
void InterruptHandlerLow(void)
|
||||||
{
|
{
|
||||||
/* check for timer2 int */
|
/* check for timer2 int */
|
||||||
if ((PIR1bits.TMR2IF) && (PIE1bits.TMR2IE))
|
if ((PIR1bits.TMR2IF) && (PIE1bits.TMR2IE)) {
|
||||||
{
|
|
||||||
PIR1bits.TMR2IF = 0;
|
PIR1bits.TMR2IF = 0;
|
||||||
Interrupt_Timer2();
|
Interrupt_Timer2();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check for timer3 int */
|
/* check for timer3 int */
|
||||||
if ((PIR2bits.TMR3IF) && (PIE2bits.TMR3IE))
|
if ((PIR2bits.TMR3IF) && (PIE2bits.TMR3IE)) {
|
||||||
{
|
|
||||||
PIR2bits.TMR3IF = 0;
|
PIR2bits.TMR3IF = 0;
|
||||||
Interrupt_Timer3();
|
Interrupt_Timer3();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check for timer4 int */
|
/* check for timer4 int */
|
||||||
if ((PIR3bits.TMR4IF) && (PIE3bits.TMR4IE))
|
if ((PIR3bits.TMR4IF) && (PIE3bits.TMR4IE)) {
|
||||||
{
|
|
||||||
PIR3bits.TMR4IF = 0;
|
PIR3bits.TMR4IF = 0;
|
||||||
dlmstp_millisecond_timer();
|
dlmstp_millisecond_timer();
|
||||||
Interrupt_Timer4();
|
Interrupt_Timer4();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check for compare int */
|
/* check for compare int */
|
||||||
if ((PIR2bits.CCP2IF) && (PIE2bits.CCP2IE))
|
if ((PIR2bits.CCP2IF) && (PIE2bits.CCP2IE)) {
|
||||||
{
|
|
||||||
PIR2bits.CCP2IF = 0;
|
PIR2bits.CCP2IF = 0;
|
||||||
Interrupt_CCP2();
|
Interrupt_CCP2();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check for USART Tx int */
|
/* check for USART Tx int */
|
||||||
if ((PIR3bits.TX2IF) && (PIE3bits.TX2IE))
|
if ((PIR3bits.TX2IF) && (PIE3bits.TX2IE)) {
|
||||||
{
|
|
||||||
RS485_Interrupt_Tx();
|
RS485_Interrupt_Tx();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check for USART Rx int */
|
/* check for USART Rx int */
|
||||||
if ((PIR3bits.RC2IF) && (PIE3bits.RC2IE))
|
if ((PIR3bits.RC2IF) && (PIE3bits.RC2IE)) {
|
||||||
{
|
|
||||||
RS485_Interrupt_Rx();
|
RS485_Interrupt_Rx();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -207,4 +190,3 @@ void Interrupt_CCP2(void)
|
|||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -52,15 +52,15 @@ static void BACnet_Service_Handlers_Init(void)
|
|||||||
/* We must implement read property - it's required! */
|
/* We must implement read property - it's required! */
|
||||||
apdu_set_confirmed_handler(SERVICE_CONFIRMED_READ_PROPERTY,
|
apdu_set_confirmed_handler(SERVICE_CONFIRMED_READ_PROPERTY,
|
||||||
handler_read_property);
|
handler_read_property);
|
||||||
//apdu_set_confirmed_handler(SERVICE_CONFIRMED_WRITE_PROPERTY,
|
/*apdu_set_confirmed_handler(SERVICE_CONFIRMED_WRITE_PROPERTY,
*/
|
||||||
// handler_write_property);
|
/* handler_write_property);
*/
|
||||||
apdu_set_confirmed_handler(SERVICE_CONFIRMED_REINITIALIZE_DEVICE,
|
apdu_set_confirmed_handler(SERVICE_CONFIRMED_REINITIALIZE_DEVICE,
|
||||||
handler_reinitialize_device);
|
handler_reinitialize_device);
|
||||||
//apdu_set_unconfirmed_handler
|
/*apdu_set_unconfirmed_handler
*/
|
||||||
// (SERVICE_UNCONFIRMED_UTC_TIME_SYNCHRONIZATION,
|
/* (SERVICE_UNCONFIRMED_UTC_TIME_SYNCHRONIZATION,
*/
|
||||||
// handler_timesync_utc);
|
/* handler_timesync_utc);
*/
|
||||||
//apdu_set_unconfirmed_handler(SERVICE_UNCONFIRMED_TIME_SYNCHRONIZATION,
|
/*apdu_set_unconfirmed_handler(SERVICE_UNCONFIRMED_TIME_SYNCHRONIZATION,
*/
|
||||||
// handler_timesync);
|
/* handler_timesync);
*/
|
||||||
/* handle communication so we can shutup when asked */
|
/* handle communication so we can shutup when asked */
|
||||||
apdu_set_confirmed_handler
|
apdu_set_confirmed_handler
|
||||||
(SERVICE_CONFIRMED_DEVICE_COMMUNICATION_CONTROL,
|
(SERVICE_CONFIRMED_DEVICE_COMMUNICATION_CONTROL,
|
||||||
@@ -72,16 +72,11 @@ void Reinitialize(void)
|
|||||||
uint8_t i;
|
uint8_t i;
|
||||||
char name = 0;
|
char name = 0;
|
||||||
|
|
||||||
_asm reset _endasm
|
_asm reset _endasm} void Global_Int(enum INT_STATE state)
|
||||||
}
|
{ /* FIX ME: add comment */
|
||||||
|
|
||||||
void Global_Int(
|
|
||||||
enum INT_STATE state) /* FIX ME: add comment */
|
|
||||||
{
|
|
||||||
static uint8_t intstate = 0;
|
static uint8_t intstate = 0;
|
||||||
|
|
||||||
switch (state)
|
switch (state) {
|
||||||
{
|
|
||||||
case INT_DISABLED:
|
case INT_DISABLED:
|
||||||
intstate >>= 2;
|
intstate >>= 2;
|
||||||
intstate |= (INTCON & 0xC0);
|
intstate |= (INTCON & 0xC0);
|
||||||
@@ -134,13 +129,11 @@ void Verify_Ints(void)
|
|||||||
void MainTasks(void)
|
void MainTasks(void)
|
||||||
{
|
{
|
||||||
/* Handle our millisecond counters */
|
/* Handle our millisecond counters */
|
||||||
while (Milliseconds)
|
while (Milliseconds) {
|
||||||
{
|
|
||||||
--Milliseconds;
|
--Milliseconds;
|
||||||
}
|
}
|
||||||
/* Handle our seconds counters */
|
/* Handle our seconds counters */
|
||||||
while (System_Seconds)
|
while (System_Seconds) {
|
||||||
{
|
|
||||||
dcc_timer_seconds(1);
|
dcc_timer_seconds(1);
|
||||||
System_Seconds--;
|
System_Seconds--;
|
||||||
}
|
}
|
||||||
@@ -159,8 +152,7 @@ void main(void)
|
|||||||
/* Greet the BACnet world! */
|
/* Greet the BACnet world! */
|
||||||
iam_send(&Handler_Transmit_Buffer[0]);
|
iam_send(&Handler_Transmit_Buffer[0]);
|
||||||
/* Main loop */
|
/* Main loop */
|
||||||
while (TRUE)
|
while (TRUE) {
|
||||||
{
|
|
||||||
RESTART_WDT();
|
RESTART_WDT();
|
||||||
Verify_Ints();
|
Verify_Ints();
|
||||||
dlmstp_task();
|
dlmstp_task();
|
||||||
|
|||||||
@@ -450,7 +450,8 @@ void MSTP_Receive_Frame_FSM(volatile struct mstp_port_struct_t *mstp_port)
|
|||||||
/* wait for the start of the next frame. */
|
/* wait for the start of the next frame. */
|
||||||
mstp_port->receive_state = MSTP_RECEIVE_STATE_IDLE;
|
mstp_port->receive_state = MSTP_RECEIVE_STATE_IDLE;
|
||||||
} else {
|
} else {
|
||||||
if ((mstp_port->DestinationAddress == mstp_port->This_Station)
|
if ((mstp_port->DestinationAddress ==
|
||||||
|
mstp_port->This_Station)
|
||||||
|| (mstp_port->DestinationAddress ==
|
|| (mstp_port->DestinationAddress ==
|
||||||
MSTP_BROADCAST_ADDRESS)) {
|
MSTP_BROADCAST_ADDRESS)) {
|
||||||
/* FrameTooLong */
|
/* FrameTooLong */
|
||||||
@@ -459,21 +460,24 @@ void MSTP_Receive_Frame_FSM(volatile struct mstp_port_struct_t *mstp_port)
|
|||||||
/* unacceptable data length has been received */
|
/* unacceptable data length has been received */
|
||||||
mstp_port->ReceivedInvalidFrame = true;
|
mstp_port->ReceivedInvalidFrame = true;
|
||||||
/* wait for the start of the next frame. */
|
/* wait for the start of the next frame. */
|
||||||
mstp_port->receive_state = MSTP_RECEIVE_STATE_IDLE;
|
mstp_port->receive_state =
|
||||||
|
MSTP_RECEIVE_STATE_IDLE;
|
||||||
}
|
}
|
||||||
/* NoData */
|
/* NoData */
|
||||||
else if (mstp_port->DataLength == 0) {
|
else if (mstp_port->DataLength == 0) {
|
||||||
/* indicate that a frame with no data has been received */
|
/* indicate that a frame with no data has been received */
|
||||||
mstp_port->ReceivedValidFrame = true;
|
mstp_port->ReceivedValidFrame = true;
|
||||||
/* wait for the start of the next frame. */
|
/* wait for the start of the next frame. */
|
||||||
mstp_port->receive_state = MSTP_RECEIVE_STATE_IDLE;
|
mstp_port->receive_state =
|
||||||
|
MSTP_RECEIVE_STATE_IDLE;
|
||||||
}
|
}
|
||||||
/* Data */
|
/* Data */
|
||||||
else {
|
else {
|
||||||
mstp_port->Index = 0;
|
mstp_port->Index = 0;
|
||||||
mstp_port->DataCRC = 0xFFFF;
|
mstp_port->DataCRC = 0xFFFF;
|
||||||
/* receive the data portion of the frame. */
|
/* receive the data portion of the frame. */
|
||||||
mstp_port->receive_state = MSTP_RECEIVE_STATE_DATA;
|
mstp_port->receive_state =
|
||||||
|
MSTP_RECEIVE_STATE_DATA;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* NotForUs */
|
/* NotForUs */
|
||||||
@@ -766,7 +770,7 @@ bool MSTP_Master_Node_FSM(volatile struct mstp_port_struct_t *mstp_port)
|
|||||||
mstp_port->DataLength);
|
mstp_port->DataLength);
|
||||||
break;
|
break;
|
||||||
case FRAME_TYPE_BACNET_DATA_EXPECTING_REPLY:
|
case FRAME_TYPE_BACNET_DATA_EXPECTING_REPLY:
|
||||||
//mstp_port->ReplyPostponedTimer = 0;
|
/*mstp_port->ReplyPostponedTimer = 0;
*/
|
||||||
/* indicate successful reception to the higher layers */
|
/* indicate successful reception to the higher layers */
|
||||||
dlmstp_put_receive(mstp_port->SourceAddress,
|
dlmstp_put_receive(mstp_port->SourceAddress,
|
||||||
(uint8_t *) & mstp_port->InputBuffer[0],
|
(uint8_t *) & mstp_port->InputBuffer[0],
|
||||||
@@ -1213,12 +1217,12 @@ void MSTP_Init(volatile struct mstp_port_struct_t *mstp_port)
|
|||||||
mstp_port->ReceivedValidFrame = false;
|
mstp_port->ReceivedValidFrame = false;
|
||||||
mstp_port->RetryCount = 0;
|
mstp_port->RetryCount = 0;
|
||||||
mstp_port->SilenceTimer = 0;
|
mstp_port->SilenceTimer = 0;
|
||||||
// mstp_port->ReplyPostponedTimer = 0;
|
/* mstp_port->ReplyPostponedTimer = 0;
*/
|
||||||
mstp_port->SoleMaster = false;
|
mstp_port->SoleMaster = false;
|
||||||
mstp_port->SourceAddress = 0;
|
mstp_port->SourceAddress = 0;
|
||||||
mstp_port->TokenCount = 0;
|
mstp_port->TokenCount = 0;
|
||||||
#if 0
|
#if 0
|
||||||
// these are adjustable, so should already be set
|
/* these are adjustable, so should already be set
*/
|
||||||
mstp_port->Nmax_info_frames = DEFAULT_MAX_INFO_FRAMES;
|
mstp_port->Nmax_info_frames = DEFAULT_MAX_INFO_FRAMES;
|
||||||
mstp_port->Nmax_master = DEFAULT_MAX_MASTER;
|
mstp_port->Nmax_master = DEFAULT_MAX_MASTER;
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -162,7 +162,7 @@ struct mstp_port_struct_t {
|
|||||||
/* Machine when a Data Expecting Reply Answer activity is completed. */
|
/* Machine when a Data Expecting Reply Answer activity is completed. */
|
||||||
/* note: we always send a reply postponed since a message other than
|
/* note: we always send a reply postponed since a message other than
|
||||||
the reply may be in the transmit queue */
|
the reply may be in the transmit queue */
|
||||||
// uint16_t ReplyPostponedTimer;
|
/* uint16_t ReplyPostponedTimer;
*/
|
||||||
|
|
||||||
/* Used to store the Source Address of a received frame. */
|
/* Used to store the Source Address of a received frame. */
|
||||||
uint8_t SourceAddress;
|
uint8_t SourceAddress;
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ uint32_t RS485_Baud_Rate = 9600;
|
|||||||
/* the ISR and other use this for status and control */
|
/* the ISR and other use this for status and control */
|
||||||
COMSTAT RS485_Comstat;
|
COMSTAT RS485_Comstat;
|
||||||
|
|
||||||
//#pragma udata MSTPPortData
|
/*#pragma udata MSTPPortData
*/
|
||||||
/* the buffer for receiving characters */
|
/* the buffer for receiving characters */
|
||||||
volatile uint8_t RS485_Rx_Buffer[MAX_MPDU];
|
volatile uint8_t RS485_Rx_Buffer[MAX_MPDU];
|
||||||
|
|
||||||
@@ -58,8 +58,8 @@ volatile uint8_t RS485_Tx_Buffer[MAX_MPDU];
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
void RS485_Send_Frame(volatile struct mstp_port_struct_t *mstp_port, /* port specific data */
|
void RS485_Send_Frame(volatile struct mstp_port_struct_t *mstp_port, /* port specific data */
|
||||||
uint8_t * buffer, /* frame to send (up to 501 bytes of data) */
|
uint8_t * buffer, /* frame to send (up to 501 bytes of data) */
|
||||||
uint16_t nbytes) /* number of bytes of data (up to 501) */
|
uint16_t nbytes)
|
||||||
{
|
{ /* number of bytes of data (up to 501) */
|
||||||
uint16_t i = 0; /* loop counter */
|
uint16_t i = 0; /* loop counter */
|
||||||
uint8_t turnaround_time;
|
uint8_t turnaround_time;
|
||||||
|
|
||||||
@@ -71,7 +71,8 @@ void RS485_Send_Frame(volatile struct mstp_port_struct_t *mstp_port, /* port
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
/* buffer is full. Wait for ISR to transmit. */
|
/* buffer is full. Wait for ISR to transmit. */
|
||||||
while (RS485_Comstat.Tx_Bytes) {};
|
while (RS485_Comstat.Tx_Bytes) {
|
||||||
|
};
|
||||||
|
|
||||||
/* wait 40 bit times since reception */
|
/* wait 40 bit times since reception */
|
||||||
if (RS485_Baud_Rate == 9600)
|
if (RS485_Baud_Rate == 9600)
|
||||||
@@ -81,16 +82,17 @@ void RS485_Send_Frame(volatile struct mstp_port_struct_t *mstp_port, /* port
|
|||||||
else
|
else
|
||||||
turnaround_time = 1;
|
turnaround_time = 1;
|
||||||
|
|
||||||
while (mstp_port->SilenceTimer < turnaround_time) {};
|
while (mstp_port->SilenceTimer < turnaround_time) {
|
||||||
|
};
|
||||||
|
|
||||||
RS485_Comstat.TxHead = 0;
|
RS485_Comstat.TxHead = 0;
|
||||||
memcpy((void *) &RS485_Tx_Buffer[0], (void *) buffer, nbytes);
|
memcpy((void *) &RS485_Tx_Buffer[0], (void *) buffer, nbytes);
|
||||||
|
|
||||||
//for (i = 0; i < nbytes; i++) {
|
/*for (i = 0; i < nbytes; i++) {
*/
|
||||||
// /* put the data into the buffer */
|
/* /* put the data into the buffer */
*/
|
||||||
// RS485_Tx_Buffer[i] = *buffer;
|
/* RS485_Tx_Buffer[i] = *buffer;
*/
|
||||||
// buffer++;
|
/* buffer++;
*/
|
||||||
//}
|
/*}
*/
|
||||||
RS485_Comstat.Tx_Bytes = nbytes;
|
RS485_Comstat.Tx_Bytes = nbytes;
|
||||||
/* disable the receiver */
|
/* disable the receiver */
|
||||||
PIE3bits.RC2IE = 0;
|
PIE3bits.RC2IE = 0;
|
||||||
@@ -113,11 +115,11 @@ void RS485_Send_Frame(volatile struct mstp_port_struct_t *mstp_port, /* port
|
|||||||
* ALGORITHM: none
|
* ALGORITHM: none
|
||||||
* NOTES: none
|
* NOTES: none
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
uint8_t RS485_Check_UART_Data(volatile struct mstp_port_struct_t *mstp_port)
|
uint8_t RS485_Check_UART_Data(volatile struct mstp_port_struct_t *
|
||||||
|
mstp_port)
|
||||||
{
|
{
|
||||||
/* check for data */
|
/* check for data */
|
||||||
if (RS485_Comstat.Rx_Bytes)
|
if (RS485_Comstat.Rx_Bytes) {
|
||||||
{
|
|
||||||
mstp_port->DataRegister = RS485_Rx_Buffer[RS485_Comstat.RxTail];
|
mstp_port->DataRegister = RS485_Rx_Buffer[RS485_Comstat.RxTail];
|
||||||
if (RS485_Comstat.RxTail >= (sizeof(RS485_Rx_Buffer) - 1))
|
if (RS485_Comstat.RxTail >= (sizeof(RS485_Rx_Buffer) - 1))
|
||||||
RS485_Comstat.RxTail = 0;
|
RS485_Comstat.RxTail = 0;
|
||||||
@@ -125,8 +127,7 @@ uint8_t RS485_Check_UART_Data(volatile struct mstp_port_struct_t *mstp_port)
|
|||||||
RS485_Comstat.RxTail++;
|
RS485_Comstat.RxTail++;
|
||||||
RS485_Comstat.Rx_Bytes--;
|
RS485_Comstat.Rx_Bytes--;
|
||||||
/* errors? let the state machine know */
|
/* errors? let the state machine know */
|
||||||
if (RS485_Comstat.Rx_Bufferoverrun)
|
if (RS485_Comstat.Rx_Bufferoverrun) {
|
||||||
{
|
|
||||||
RS485_Comstat.Rx_Bufferoverrun = FALSE;
|
RS485_Comstat.Rx_Bufferoverrun = FALSE;
|
||||||
mstp_port->ReceiveError = TRUE;
|
mstp_port->ReceiveError = TRUE;
|
||||||
}
|
}
|
||||||
@@ -137,6 +138,7 @@ uint8_t RS485_Check_UART_Data(volatile struct mstp_port_struct_t *mstp_port)
|
|||||||
|
|
||||||
return RS485_Comstat.Rx_Bytes;
|
return RS485_Comstat.Rx_Bytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* *************************************************************************
|
/* *************************************************************************
|
||||||
DESCRIPTION: Receives RS485 data stream
|
DESCRIPTION: Receives RS485 data stream
|
||||||
|
|
||||||
@@ -150,25 +152,20 @@ void RS485_Interrupt_Rx(void)
|
|||||||
{
|
{
|
||||||
char dummy;
|
char dummy;
|
||||||
|
|
||||||
if ((RCSTA2bits.FERR) || (RCSTA2bits.OERR))
|
if ((RCSTA2bits.FERR) || (RCSTA2bits.OERR)) {
|
||||||
{
|
|
||||||
/* Clear the error */
|
/* Clear the error */
|
||||||
RCSTA2bits.CREN = 0;
|
RCSTA2bits.CREN = 0;
|
||||||
RCSTA2bits.CREN = 1;
|
RCSTA2bits.CREN = 1;
|
||||||
RS485_Comstat.Rx_Bufferoverrun = TRUE;
|
RS485_Comstat.Rx_Bufferoverrun = TRUE;
|
||||||
dummy = RCREG2;
|
dummy = RCREG2;
|
||||||
}
|
} else if (RS485_Comstat.Rx_Bytes < sizeof(RS485_Rx_Buffer)) {
|
||||||
else if (RS485_Comstat.Rx_Bytes < sizeof(RS485_Rx_Buffer))
|
|
||||||
{
|
|
||||||
RS485_Rx_Buffer[RS485_Comstat.RxHead] = RCREG2;
|
RS485_Rx_Buffer[RS485_Comstat.RxHead] = RCREG2;
|
||||||
if (RS485_Comstat.RxHead >= (sizeof(RS485_Rx_Buffer) - 1))
|
if (RS485_Comstat.RxHead >= (sizeof(RS485_Rx_Buffer) - 1))
|
||||||
RS485_Comstat.RxHead = 0;
|
RS485_Comstat.RxHead = 0;
|
||||||
else
|
else
|
||||||
RS485_Comstat.RxHead++;
|
RS485_Comstat.RxHead++;
|
||||||
RS485_Comstat.Rx_Bytes++;
|
RS485_Comstat.Rx_Bytes++;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
RS485_Comstat.Rx_Bufferoverrun = TRUE;
|
RS485_Comstat.Rx_Bufferoverrun = TRUE;
|
||||||
dummy = RCREG2;
|
dummy = RCREG2;
|
||||||
(void) dummy;
|
(void) dummy;
|
||||||
@@ -186,17 +183,14 @@ void RS485_Interrupt_Rx(void)
|
|||||||
*************************************************************************** */
|
*************************************************************************** */
|
||||||
void RS485_Interrupt_Tx(void)
|
void RS485_Interrupt_Tx(void)
|
||||||
{
|
{
|
||||||
if (RS485_Comstat.Tx_Bytes)
|
if (RS485_Comstat.Tx_Bytes) {
|
||||||
{
|
|
||||||
/* Get the data byte */
|
/* Get the data byte */
|
||||||
TXREG2 = RS485_Tx_Buffer[RS485_Comstat.TxHead];
|
TXREG2 = RS485_Tx_Buffer[RS485_Comstat.TxHead];
|
||||||
/* point to the next byte */
|
/* point to the next byte */
|
||||||
RS485_Comstat.TxHead++;
|
RS485_Comstat.TxHead++;
|
||||||
/* reduce the buffer size */
|
/* reduce the buffer size */
|
||||||
RS485_Comstat.Tx_Bytes--;
|
RS485_Comstat.Tx_Bytes--;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
/* wait for the USART to be empty */
|
/* wait for the USART to be empty */
|
||||||
while (!TXSTA2bits.TRMT);
|
while (!TXSTA2bits.TRMT);
|
||||||
/* disable this interrupt */
|
/* disable this interrupt */
|
||||||
@@ -204,7 +198,7 @@ void RS485_Interrupt_Tx(void)
|
|||||||
/* enable the receiver */
|
/* enable the receiver */
|
||||||
RS485_TX_ENABLE = 0;
|
RS485_TX_ENABLE = 0;
|
||||||
RS485_RX_DISABLE = 0;
|
RS485_RX_DISABLE = 0;
|
||||||
// FIXME: might not be necessary
|
/* FIXME: might not be necessary
*/
|
||||||
PIE3bits.RC2IE = 1;
|
PIE3bits.RC2IE = 1;
|
||||||
RCSTA2bits.CREN = 1;
|
RCSTA2bits.CREN = 1;
|
||||||
}
|
}
|
||||||
@@ -231,8 +225,7 @@ bool RS485_Set_Baud_Rate(uint32_t baud)
|
|||||||
{
|
{
|
||||||
bool valid = true;
|
bool valid = true;
|
||||||
|
|
||||||
switch (baud)
|
switch (baud) {
|
||||||
{
|
|
||||||
case 9600:
|
case 9600:
|
||||||
case 19200:
|
case 19200:
|
||||||
case 38400:
|
case 38400:
|
||||||
@@ -294,8 +287,7 @@ void RS485_Initialize_Port(void)
|
|||||||
625000 1
|
625000 1
|
||||||
1250000 0
|
1250000 0
|
||||||
*/
|
*/
|
||||||
switch (RS485_Baud_Rate)
|
switch (RS485_Baud_Rate) {
|
||||||
{
|
|
||||||
case 19200:
|
case 19200:
|
||||||
SPBRG2 = 64;
|
SPBRG2 = 64;
|
||||||
TXSTA2bits.BRGH = 1;
|
TXSTA2bits.BRGH = 1;
|
||||||
|
|||||||
@@ -39,8 +39,7 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "mstp.h"
|
#include "mstp.h"
|
||||||
|
|
||||||
typedef struct
|
typedef struct {
|
||||||
{
|
|
||||||
uint8_t RxHead;
|
uint8_t RxHead;
|
||||||
uint8_t RxTail;
|
uint8_t RxTail;
|
||||||
uint8_t Rx_Bytes;
|
uint8_t Rx_Bytes;
|
||||||
|
|||||||
+2
-5
@@ -298,11 +298,8 @@ bool tsm_invoke_id_failed(uint8_t invokeID)
|
|||||||
bool I_Am_Request = true;
|
bool I_Am_Request = true;
|
||||||
|
|
||||||
/* dummy function stubs */
|
/* dummy function stubs */
|
||||||
int datalink_send_pdu(
|
int datalink_send_pdu(BACNET_ADDRESS * dest,
|
||||||
BACNET_ADDRESS * dest,
|
BACNET_NPDU_DATA * npdu_data, uint8_t * pdu, unsigned pdu_len)
|
||||||
BACNET_NPDU_DATA * npdu_data,
|
|
||||||
uint8_t * pdu,
|
|
||||||
unsigned pdu_len)
|
|
||||||
{
|
{
|
||||||
(void) dest;
|
(void) dest;
|
||||||
(void) npdu_data;
|
(void) npdu_data;
|
||||||
|
|||||||
+11
-19
@@ -195,7 +195,8 @@ int wp_decode_apdu(uint8_t * apdu,
|
|||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
void testWritePropertyTag(Test * pTest, BACNET_APPLICATION_DATA_VALUE * value)
|
void testWritePropertyTag(Test * pTest,
|
||||||
|
BACNET_APPLICATION_DATA_VALUE * value)
|
||||||
{
|
{
|
||||||
BACNET_WRITE_PROPERTY_DATA data = { 0 };
|
BACNET_WRITE_PROPERTY_DATA data = { 0 };
|
||||||
BACNET_WRITE_PROPERTY_DATA test_data = { 0 };
|
BACNET_WRITE_PROPERTY_DATA test_data = { 0 };
|
||||||
@@ -219,17 +220,14 @@ void testWritePropertyTag(Test * pTest, BACNET_APPLICATION_DATA_VALUE * value)
|
|||||||
ct_test(pTest, test_data.object_property == data.object_property);
|
ct_test(pTest, test_data.object_property == data.object_property);
|
||||||
ct_test(pTest, test_data.array_index == data.array_index);
|
ct_test(pTest, test_data.array_index == data.array_index);
|
||||||
/* decode the application value of the request */
|
/* decode the application value of the request */
|
||||||
len = bacapp_decode_application_data(
|
len = bacapp_decode_application_data(test_data.application_data,
|
||||||
test_data.application_data,
|
test_data.application_data_len, &test_value);
|
||||||
test_data.application_data_len,
|
|
||||||
&test_value);
|
|
||||||
ct_test(pTest, test_value.tag == value->tag);
|
ct_test(pTest, test_value.tag == value->tag);
|
||||||
switch (test_value.tag) {
|
switch (test_value.tag) {
|
||||||
case BACNET_APPLICATION_TAG_NULL:
|
case BACNET_APPLICATION_TAG_NULL:
|
||||||
break;
|
break;
|
||||||
case BACNET_APPLICATION_TAG_BOOLEAN:
|
case BACNET_APPLICATION_TAG_BOOLEAN:
|
||||||
ct_test(pTest, test_value.type.Boolean ==
|
ct_test(pTest, test_value.type.Boolean == value->type.Boolean);
|
||||||
value->type.Boolean);
|
|
||||||
break;
|
break;
|
||||||
case BACNET_APPLICATION_TAG_UNSIGNED_INT:
|
case BACNET_APPLICATION_TAG_UNSIGNED_INT:
|
||||||
ct_test(pTest, test_value.type.Unsigned_Int ==
|
ct_test(pTest, test_value.type.Unsigned_Int ==
|
||||||
@@ -247,22 +245,16 @@ void testWritePropertyTag(Test * pTest, BACNET_APPLICATION_DATA_VALUE * value)
|
|||||||
value->type.Enumerated);
|
value->type.Enumerated);
|
||||||
break;
|
break;
|
||||||
case BACNET_APPLICATION_TAG_DATE:
|
case BACNET_APPLICATION_TAG_DATE:
|
||||||
ct_test(pTest, test_value.type.Date.year ==
|
ct_test(pTest, test_value.type.Date.year == value->type.Date.year);
|
||||||
value->type.Date.year);
|
|
||||||
ct_test(pTest, test_value.type.Date.month ==
|
ct_test(pTest, test_value.type.Date.month ==
|
||||||
value->type.Date.month);
|
value->type.Date.month);
|
||||||
ct_test(pTest, test_value.type.Date.day ==
|
ct_test(pTest, test_value.type.Date.day == value->type.Date.day);
|
||||||
value->type.Date.day);
|
ct_test(pTest, test_value.type.Date.wday == value->type.Date.wday);
|
||||||
ct_test(pTest, test_value.type.Date.wday ==
|
|
||||||
value->type.Date.wday);
|
|
||||||
break;
|
break;
|
||||||
case BACNET_APPLICATION_TAG_TIME:
|
case BACNET_APPLICATION_TAG_TIME:
|
||||||
ct_test(pTest, test_value.type.Time.hour ==
|
ct_test(pTest, test_value.type.Time.hour == value->type.Time.hour);
|
||||||
value->type.Time.hour);
|
ct_test(pTest, test_value.type.Time.min == value->type.Time.min);
|
||||||
ct_test(pTest, test_value.type.Time.min ==
|
ct_test(pTest, test_value.type.Time.sec == value->type.Time.sec);
|
||||||
value->type.Time.min);
|
|
||||||
ct_test(pTest, test_value.type.Time.sec ==
|
|
||||||
value->type.Time.sec);
|
|
||||||
ct_test(pTest, test_value.type.Time.hundredths ==
|
ct_test(pTest, test_value.type.Time.hundredths ==
|
||||||
value->type.Time.hundredths);
|
value->type.Time.hundredths);
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user