indented using indent.sh script to get uniform looking code for release

This commit is contained in:
skarg
2013-03-13 22:17:13 +00:00
parent 2de46521b8
commit ba3242aafd
120 changed files with 3382 additions and 3299 deletions
+2 -1
View File
@@ -211,7 +211,8 @@ int main(
} }
/* at least one second has passed */ /* at least one second has passed */
if (current_seconds != last_seconds) if (current_seconds != last_seconds)
tsm_timer_milliseconds((uint16_t)((current_seconds - last_seconds) * 1000)); tsm_timer_milliseconds((uint16_t) ((current_seconds -
last_seconds) * 1000));
if (Error_Detected) if (Error_Detected)
break; break;
/* wait until the device is bound, or timeout and quit */ /* wait until the device is bound, or timeout and quit */
+18 -13
View File
@@ -141,7 +141,8 @@ static struct property_value_list_t Property_Value_List[] = {
{-1, NULL} {-1, NULL}
}; };
static BACNET_APPLICATION_DATA_VALUE *object_property_value(int32_t property_id) static BACNET_APPLICATION_DATA_VALUE *object_property_value(
int32_t property_id)
{ {
BACNET_APPLICATION_DATA_VALUE *value = NULL; BACNET_APPLICATION_DATA_VALUE *value = NULL;
int32_t index = 0; int32_t index = 0;
@@ -414,8 +415,10 @@ void CheckIsWritableProperty(
bIsWritable = true; bIsWritable = true;
} }
} else if (object_type == OBJECT_NETWORK_SECURITY) { } else if (object_type == OBJECT_NETWORK_SECURITY) {
if ((rpm_property->propertyIdentifier == PROP_BASE_DEVICE_SECURITY_POLICY) || if ((rpm_property->propertyIdentifier ==
(rpm_property->propertyIdentifier == PROP_NETWORK_ACCESS_SECURITY_POLICIES) || PROP_BASE_DEVICE_SECURITY_POLICY) ||
(rpm_property->propertyIdentifier ==
PROP_NETWORK_ACCESS_SECURITY_POLICIES) ||
(rpm_property->propertyIdentifier == PROP_SECURITY_TIME_WINDOW) || (rpm_property->propertyIdentifier == PROP_SECURITY_TIME_WINDOW) ||
(rpm_property->propertyIdentifier == PROP_PACKET_REORDER_TIME) || (rpm_property->propertyIdentifier == PROP_PACKET_REORDER_TIME) ||
(rpm_property->propertyIdentifier == PROP_LAST_KEY_SERVER) || (rpm_property->propertyIdentifier == PROP_LAST_KEY_SERVER) ||
@@ -434,7 +437,8 @@ void CheckIsWritableProperty(
} }
static const char *protocol_services_supported_text(size_t bit_index) static const char *protocol_services_supported_text(
size_t bit_index)
{ {
bool is_confirmed = false; bool is_confirmed = false;
size_t text_index = 0; size_t text_index = 0;
@@ -1154,9 +1158,8 @@ void PrintHeading(
(value->tag == BACNET_APPLICATION_TAG_CHARACTER_STRING)) { (value->tag == BACNET_APPLICATION_TAG_CHARACTER_STRING)) {
printf("Product Description: \"%s\"\r\n\r\n", printf("Product Description: \"%s\"\r\n\r\n",
characterstring_value(&value->type.Character_String)); characterstring_value(&value->type.Character_String));
}else { } else {
printf( printf("Product Description: "
"Product Description: "
"\"your product description here\"\r\n\r\n"); "\"your product description here\"\r\n\r\n");
} }
printf("BIBBs Supported:\r\n"); printf("BIBBs Supported:\r\n");
@@ -1220,7 +1223,8 @@ void PrintHeading(
printf("-- SubscribeCOVProperty Initiate Execute\r\n"); printf("-- SubscribeCOVProperty Initiate Execute\r\n");
#ifdef BAC_ROUTING #ifdef BAC_ROUTING
if (Target_Address.net == 0) { if (Target_Address.net == 0) {
printf("-- Note: The following Routing Services are Supported:\r\n"); printf
("-- Note: The following Routing Services are Supported:\r\n");
printf("-- Who-Is-Router-To-Network Initiate Execute\r\n"); printf("-- Who-Is-Router-To-Network Initiate Execute\r\n");
printf("-- I-Am-Router-To-Network Initiate Execute\r\n"); printf("-- I-Am-Router-To-Network Initiate Execute\r\n");
printf("-- Initialize-Routing-Table Execute\r\n"); printf("-- Initialize-Routing-Table Execute\r\n");
@@ -1441,7 +1445,8 @@ int main(
current_seconds = time(NULL); current_seconds = time(NULL);
/* Has at least one second passed ? */ /* Has at least one second passed ? */
if (current_seconds != last_seconds) { if (current_seconds != last_seconds) {
tsm_timer_milliseconds((uint16_t)((current_seconds - last_seconds) * 1000)); tsm_timer_milliseconds((uint16_t) ((current_seconds -
last_seconds) * 1000));
} }
/* OK to proceed; see what we are up to now */ /* OK to proceed; see what we are up to now */
@@ -1629,11 +1634,11 @@ int main(
(Request_Invoke_ID == (Request_Invoke_ID ==
Read_Property_Multiple_Data.service_data.invoke_id)) { Read_Property_Multiple_Data.service_data.invoke_id)) {
Read_Property_Multiple_Data.new_data = false; Read_Property_Multiple_Data.new_data = false;
PrintReadPropertyData PrintReadPropertyData(Read_Property_Multiple_Data.
(Read_Property_Multiple_Data.rpm_data->object_type, rpm_data->object_type,
Read_Property_Multiple_Data.rpm_data->object_instance, Read_Property_Multiple_Data.rpm_data->object_instance,
Read_Property_Multiple_Data. Read_Property_Multiple_Data.rpm_data->
rpm_data->listOfProperties); listOfProperties);
if (tsm_invoke_id_free(Request_Invoke_ID)) { if (tsm_invoke_id_free(Request_Invoke_ID)) {
Request_Invoke_ID = 0; Request_Invoke_ID = 0;
} else { } else {
+2 -2
View File
@@ -150,7 +150,7 @@ int dlenv_register_as_foreign_device(
if (retval < 0) if (retval < 0)
fprintf(stderr, "FAILED to Register with BBMD at %s \n", fprintf(stderr, "FAILED to Register with BBMD at %s \n",
inet_ntoa(addr)); inet_ntoa(addr));
BBMD_Timer_Seconds = (uint16_t)bbmd_timetolive_seconds; BBMD_Timer_Seconds = (uint16_t) bbmd_timetolive_seconds;
} }
bbmd_result = retval; bbmd_result = retval;
@@ -176,7 +176,7 @@ void dlenv_maintenance_timer(
BBMD_Timer_Seconds -= elapsed_seconds; BBMD_Timer_Seconds -= elapsed_seconds;
} }
if (BBMD_Timer_Seconds == 0) { if (BBMD_Timer_Seconds == 0) {
(void)dlenv_register_as_foreign_device(); (void) dlenv_register_as_foreign_device();
/* If that failed (negative), maybe just a network issue. /* If that failed (negative), maybe just a network issue.
* If nothing happened (0), may be un/misconfigured. * If nothing happened (0), may be un/misconfigured.
* Set up to try again later in all cases. */ * Set up to try again later in all cases. */
+2 -2
View File
@@ -125,8 +125,8 @@ void handler_ccov_notification(
fprintf(stderr, "CCOV: "); fprintf(stderr, "CCOV: ");
if (pProperty_value->propertyIdentifier < 512) { if (pProperty_value->propertyIdentifier < 512) {
fprintf(stderr, "%s ", fprintf(stderr, "%s ",
bactext_property_name(pProperty_value-> bactext_property_name
propertyIdentifier)); (pProperty_value->propertyIdentifier));
} else { } else {
fprintf(stderr, "proprietary %u ", fprintf(stderr, "proprietary %u ",
pProperty_value->propertyIdentifier); pProperty_value->propertyIdentifier);
+17 -16
View File
@@ -311,7 +311,7 @@ static bool cov_list_subscribe(
/* From BACnet Standard 135-2010-13.14.2 /* From BACnet Standard 135-2010-13.14.2
...Cancellations that are issued for which no matching COV ...Cancellations that are issued for which no matching COV
context can be found shall succeed as if a context had context can be found shall succeed as if a context had
existed, returning 'Result(+)'.*/ existed, returning 'Result(+)'. */
found = true; found = true;
} }
} }
@@ -406,10 +406,10 @@ static void cov_lifetime_expiration_handler(
/* expire the subscription */ /* expire the subscription */
#if PRINT_ENABLED #if PRINT_ENABLED
fprintf(stderr, "COVtimer: PID=%u ", fprintf(stderr, "COVtimer: PID=%u ",
COV_Subscriptions[index].subscriberProcessIdentifier); COV_Subscriptions[index].subscriberProcessIdentifier);
fprintf(stderr, "%s %u ", fprintf(stderr, "%s %u ",
bactext_object_type_name( bactext_object_type_name(COV_Subscriptions[index].
COV_Subscriptions[index].monitoredObjectIdentifier.type), monitoredObjectIdentifier.type),
COV_Subscriptions[index].monitoredObjectIdentifier.instance); COV_Subscriptions[index].monitoredObjectIdentifier.instance);
fprintf(stderr, "time remaining=%u seconds ", fprintf(stderr, "time remaining=%u seconds ",
COV_Subscriptions[index].lifetime); COV_Subscriptions[index].lifetime);
@@ -497,13 +497,13 @@ void handler_cov_task(
object_type = (BACNET_OBJECT_TYPE) object_type = (BACNET_OBJECT_TYPE)
COV_Subscriptions[index].monitoredObjectIdentifier.type; COV_Subscriptions[index].monitoredObjectIdentifier.type;
object_instance = object_instance =
COV_Subscriptions[index].monitoredObjectIdentifier. COV_Subscriptions[index].
instance; monitoredObjectIdentifier.instance;
status = Device_COV(object_type, object_instance); status = Device_COV(object_type, object_instance);
if (status) { if (status) {
COV_Subscriptions[index].flag.send_requested = true; COV_Subscriptions[index].flag.send_requested = true;
#if PRINT_ENABLED #if PRINT_ENABLED
fprintf(stderr,"COVtask: Marking...\n"); fprintf(stderr, "COVtask: Marking...\n");
#endif #endif
} }
} }
@@ -520,8 +520,8 @@ void handler_cov_task(
object_type = (BACNET_OBJECT_TYPE) object_type = (BACNET_OBJECT_TYPE)
COV_Subscriptions[index].monitoredObjectIdentifier.type; COV_Subscriptions[index].monitoredObjectIdentifier.type;
object_instance = object_instance =
COV_Subscriptions[index].monitoredObjectIdentifier. COV_Subscriptions[index].
instance; monitoredObjectIdentifier.instance;
Device_COV_Clear(object_type, object_instance); Device_COV_Clear(object_type, object_instance);
} }
index++; index++;
@@ -537,8 +537,9 @@ void handler_cov_task(
(COV_Subscriptions[index].invokeID)) { (COV_Subscriptions[index].invokeID)) {
if (tsm_invoke_id_free(COV_Subscriptions[index].invokeID)) { if (tsm_invoke_id_free(COV_Subscriptions[index].invokeID)) {
COV_Subscriptions[index].invokeID = 0; COV_Subscriptions[index].invokeID = 0;
} else if (tsm_invoke_id_failed(COV_Subscriptions[index]. } else
invokeID)) { if (tsm_invoke_id_failed(COV_Subscriptions
[index].invokeID)) {
tsm_free_invoke_id(COV_Subscriptions[index].invokeID); tsm_free_invoke_id(COV_Subscriptions[index].invokeID);
COV_Subscriptions[index].invokeID = 0; COV_Subscriptions[index].invokeID = 0;
} }
@@ -566,13 +567,13 @@ void handler_cov_task(
} }
if (send) { if (send) {
object_type = (BACNET_OBJECT_TYPE) object_type = (BACNET_OBJECT_TYPE)
COV_Subscriptions[index].monitoredObjectIdentifier. COV_Subscriptions[index].
type; monitoredObjectIdentifier.type;
object_instance = object_instance =
COV_Subscriptions[index].monitoredObjectIdentifier. COV_Subscriptions[index].
instance; monitoredObjectIdentifier.instance;
#if PRINT_ENABLED #if PRINT_ENABLED
fprintf(stderr,"COVtask: Sending...\n"); fprintf(stderr, "COVtask: Sending...\n");
#endif #endif
/* configure the linked list for the two properties */ /* configure the linked list for the two properties */
value_list[0].next = &value_list[1]; value_list[0].next = &value_list[1];
+8 -9
View File
@@ -56,24 +56,23 @@
* decoded from the APDU header of this message. * decoded from the APDU header of this message.
*/ */
void get_alarm_summary_ack_handler( void get_alarm_summary_ack_handler(
uint8_t *service_request, uint8_t * service_request,
uint16_t service_len, uint16_t service_len,
BACNET_ADDRESS *src, BACNET_ADDRESS * src,
BACNET_CONFIRMED_SERVICE_ACK_DATA *service_data) BACNET_CONFIRMED_SERVICE_ACK_DATA * service_data)
{ {
uint16_t apdu_len = 0; uint16_t apdu_len = 0;
uint16_t len = 0; uint16_t len = 0;
BACNET_GET_ALARM_SUMMARY_DATA data; BACNET_GET_ALARM_SUMMARY_DATA data;
while(service_len - len){ while (service_len - len) {
apdu_len = get_alarm_summary_ack_decode_apdu_data( apdu_len =
&service_request[len], get_alarm_summary_ack_decode_apdu_data(&service_request[len],
service_len - len, service_len - len, &data);
&data);
len += apdu_len; len += apdu_len;
if(apdu_len > 0){ if (apdu_len > 0) {
/* FIXME: Add code to process data */ /* FIXME: Add code to process data */
} else { } else {
break; break;
+6 -6
View File
@@ -221,8 +221,8 @@ void rpm_ack_print_data(
#if PRINT_ENABLED #if PRINT_ENABLED
if (listOfProperties->propertyIdentifier < 512) { if (listOfProperties->propertyIdentifier < 512) {
fprintf(stdout, " %s: ", fprintf(stdout, " %s: ",
bactext_property_name bactext_property_name(listOfProperties->
(listOfProperties->propertyIdentifier)); propertyIdentifier));
} else { } else {
fprintf(stdout, " proprietary %u: ", fprintf(stdout, " proprietary %u: ",
(unsigned) listOfProperties->propertyIdentifier); (unsigned) listOfProperties->propertyIdentifier);
@@ -269,10 +269,10 @@ void rpm_ack_print_data(
#if PRINT_ENABLED #if PRINT_ENABLED
/* AccessError */ /* AccessError */
fprintf(stdout, "BACnet Error: %s: %s\r\n", fprintf(stdout, "BACnet Error: %s: %s\r\n",
bactext_error_class_name((int) listOfProperties->error. bactext_error_class_name((int) listOfProperties->
error_class), error.error_class),
bactext_error_code_name((int) listOfProperties->error. bactext_error_code_name((int) listOfProperties->
error_code)); error.error_code));
#endif #endif
} }
listOfProperties = listOfProperties->next; listOfProperties = listOfProperties->next;
+2 -2
View File
@@ -104,8 +104,8 @@ void handler_ucov_notification(
fprintf(stderr, "UCOV: "); fprintf(stderr, "UCOV: ");
if (pProperty_value->propertyIdentifier < 512) { if (pProperty_value->propertyIdentifier < 512) {
fprintf(stderr, "%s ", fprintf(stderr, "%s ",
bactext_property_name(pProperty_value-> bactext_property_name
propertyIdentifier)); (pProperty_value->propertyIdentifier));
} else { } else {
fprintf(stderr, "proprietary %u ", fprintf(stderr, "proprietary %u ",
pProperty_value->propertyIdentifier); pProperty_value->propertyIdentifier);
+3 -2
View File
@@ -65,8 +65,9 @@ static void match_name_or_object(
} else { } else {
/* valid object_name copy in my device? */ /* valid object_name copy in my device? */
found = found =
Device_Object_Name_Copy((BACNET_OBJECT_TYPE) data->object. Device_Object_Name_Copy((BACNET_OBJECT_TYPE) data->
identifier.type, data->object.identifier.instance, &object_name); object.identifier.type, data->object.identifier.instance,
&object_name);
if (found) { if (found) {
Send_I_Have(Device_Object_Instance_Number(), Send_I_Have(Device_Object_Instance_Number(),
(BACNET_OBJECT_TYPE) data->object.identifier.type, (BACNET_OBJECT_TYPE) data->object.identifier.type,
+3 -4
View File
@@ -175,10 +175,9 @@ void handler_write_property_multiple(
fprintf(stderr, "WPM: Sending Abort!\n"); fprintf(stderr, "WPM: Sending Abort!\n");
#endif #endif
} else if (len == BACNET_STATUS_ERROR) { } else if (len == BACNET_STATUS_ERROR) {
apdu_len = wpm_error_ack_encode_apdu( apdu_len =
&Handler_Transmit_Buffer[npdu_len], wpm_error_ack_encode_apdu(&Handler_Transmit_Buffer[npdu_len],
service_data->invoke_id, service_data->invoke_id, &wp_data);
&wp_data);
#if PRINT_ENABLED #if PRINT_ENABLED
fprintf(stderr, "WPM: Sending Error!\n"); fprintf(stderr, "WPM: Sending Error!\n");
#endif #endif
+1 -1
View File
@@ -97,7 +97,7 @@ uint8_t Send_Private_Transfer_Request(
block->cMyByte2); block->cMyByte2);
len += len +=
encode_application_real(&pt_req_buffer[len], block->fMyReal); encode_application_real(&pt_req_buffer[len], block->fMyReal);
characterstring_init_ansi(&bsTemp, (char *)block->sMyString); characterstring_init_ansi(&bsTemp, (char *) block->sMyString);
len += len +=
encode_application_character_string(&pt_req_buffer[len], encode_application_character_string(&pt_req_buffer[len],
&bsTemp); &bsTemp);
+5 -6
View File
@@ -60,7 +60,7 @@
* @return invoke id of outgoing message, or 0 if device is not bound or no tsm available * @return invoke id of outgoing message, or 0 if device is not bound or no tsm available
*/ */
uint8_t Send_Read_Property_Request_Address( uint8_t Send_Read_Property_Request_Address(
BACNET_ADDRESS *dest, BACNET_ADDRESS * dest,
uint16_t max_apdu, uint16_t max_apdu,
BACNET_OBJECT_TYPE object_type, BACNET_OBJECT_TYPE object_type,
uint32_t object_instance, uint32_t object_instance,
@@ -149,7 +149,7 @@ uint8_t Send_Read_Property_Request(
BACNET_PROPERTY_ID object_property, BACNET_PROPERTY_ID object_property,
uint32_t array_index) uint32_t array_index)
{ {
BACNET_ADDRESS dest = {0}; BACNET_ADDRESS dest = { 0 };
unsigned max_apdu = 0; unsigned max_apdu = 0;
uint8_t invoke_id = 0; uint8_t invoke_id = 0;
bool status = false; bool status = false;
@@ -157,10 +157,9 @@ uint8_t Send_Read_Property_Request(
/* is the device bound? */ /* is the device bound? */
status = address_get_by_device(device_id, &max_apdu, &dest); status = address_get_by_device(device_id, &max_apdu, &dest);
if (status) { if (status) {
invoke_id = Send_Read_Property_Request_Address( invoke_id =
&dest, max_apdu, object_type, Send_Read_Property_Request_Address(&dest, max_apdu, object_type,
object_instance, object_property, object_instance, object_property, array_index);
array_index);
} }
return invoke_id; return invoke_id;
+3 -2
View File
@@ -157,8 +157,9 @@ uint8_t Send_Write_Property_Request(
#if PRINT_ENABLED_DEBUG #if PRINT_ENABLED_DEBUG
fprintf(stderr, "WriteProperty service: " "%s tag=%d\n", fprintf(stderr, "WriteProperty service: " "%s tag=%d\n",
(object_value->context_specific ? "context" : "application"), (object_value->context_specific ? "context" : "application"),
(int) (object_value->context_specific ? object_value-> (int) (object_value->
context_tag : object_value->tag)); context_specific ? object_value->context_tag : object_value->
tag));
#endif #endif
len = bacapp_encode_data(&application_data[apdu_len], object_value); len = bacapp_encode_data(&application_data[apdu_len], object_value);
if ((len + apdu_len) < MAX_APDU) { if ((len + apdu_len) < MAX_APDU) {
+3 -3
View File
@@ -316,13 +316,13 @@ static void packet_statistics_clear(
} }
static uint32_t Timer_Silence( static uint32_t Timer_Silence(
void * pArg) void *pArg)
{ {
return timer_milliseconds(TIMER_SILENCE); return timer_milliseconds(TIMER_SILENCE);
} }
static void Timer_Silence_Reset( static void Timer_Silence_Reset(
void * pArg) void *pArg)
{ {
timer_reset(TIMER_SILENCE); timer_reset(TIMER_SILENCE);
} }
@@ -823,7 +823,7 @@ int main(
if (test_global_header(argv[2])) { if (test_global_header(argv[2])) {
while (read_received_packet(mstp_port)) { while (read_received_packet(mstp_port)) {
packet_count++; packet_count++;
fprintf(stderr, "\r%u packets", (unsigned)packet_count); fprintf(stderr, "\r%u packets", (unsigned) packet_count);
} }
if (packet_count) { if (packet_count) {
packet_statistics_print(); packet_statistics_print();
+67 -73
View File
@@ -352,11 +352,11 @@ int Analog_Input_Read_Property(
case PROP_LIMIT_ENABLE: case PROP_LIMIT_ENABLE:
bitstring_init(&bit_string); bitstring_init(&bit_string);
bitstring_set_bit(&bit_string, 0, bitstring_set_bit(&bit_string, 0,
(CurrentAI->Limit_Enable & EVENT_LOW_LIMIT_ENABLE) ? true : (CurrentAI->
false); Limit_Enable & EVENT_LOW_LIMIT_ENABLE) ? true : false);
bitstring_set_bit(&bit_string, 1, bitstring_set_bit(&bit_string, 1,
(CurrentAI->Limit_Enable & EVENT_HIGH_LIMIT_ENABLE) ? true : (CurrentAI->
false); Limit_Enable & EVENT_HIGH_LIMIT_ENABLE) ? true : false);
apdu_len = encode_application_bitstring(&apdu[0], &bit_string); apdu_len = encode_application_bitstring(&apdu[0], &bit_string);
break; break;
@@ -364,14 +364,14 @@ int Analog_Input_Read_Property(
case PROP_EVENT_ENABLE: case PROP_EVENT_ENABLE:
bitstring_init(&bit_string); bitstring_init(&bit_string);
bitstring_set_bit(&bit_string, TRANSITION_TO_OFFNORMAL, bitstring_set_bit(&bit_string, TRANSITION_TO_OFFNORMAL,
(CurrentAI->Event_Enable & EVENT_ENABLE_TO_OFFNORMAL) ? true : (CurrentAI->
false); Event_Enable & EVENT_ENABLE_TO_OFFNORMAL) ? true : false);
bitstring_set_bit(&bit_string, TRANSITION_TO_FAULT, bitstring_set_bit(&bit_string, TRANSITION_TO_FAULT,
(CurrentAI->Event_Enable & EVENT_ENABLE_TO_FAULT) ? true : (CurrentAI->
false); Event_Enable & EVENT_ENABLE_TO_FAULT) ? true : false);
bitstring_set_bit(&bit_string, TRANSITION_TO_NORMAL, bitstring_set_bit(&bit_string, TRANSITION_TO_NORMAL,
(CurrentAI->Event_Enable & EVENT_ENABLE_TO_NORMAL) ? true : (CurrentAI->
false); Event_Enable & EVENT_ENABLE_TO_NORMAL) ? true : false);
apdu_len = encode_application_bitstring(&apdu[0], &bit_string); apdu_len = encode_application_bitstring(&apdu[0], &bit_string);
break; break;
@@ -379,8 +379,8 @@ int Analog_Input_Read_Property(
case PROP_ACKED_TRANSITIONS: case PROP_ACKED_TRANSITIONS:
bitstring_init(&bit_string); bitstring_init(&bit_string);
bitstring_set_bit(&bit_string, TRANSITION_TO_OFFNORMAL, bitstring_set_bit(&bit_string, TRANSITION_TO_OFFNORMAL,
CurrentAI-> CurrentAI->Acked_Transitions[TRANSITION_TO_OFFNORMAL].
Acked_Transitions[TRANSITION_TO_OFFNORMAL].bIsAcked); bIsAcked);
bitstring_set_bit(&bit_string, TRANSITION_TO_FAULT, bitstring_set_bit(&bit_string, TRANSITION_TO_FAULT,
CurrentAI->Acked_Transitions[TRANSITION_TO_FAULT].bIsAcked); CurrentAI->Acked_Transitions[TRANSITION_TO_FAULT].bIsAcked);
bitstring_set_bit(&bit_string, TRANSITION_TO_NORMAL, bitstring_set_bit(&bit_string, TRANSITION_TO_NORMAL,
@@ -637,7 +637,7 @@ bool Analog_Input_Write_Property(
&wp_data->error_class, &wp_data->error_code); &wp_data->error_class, &wp_data->error_code);
if (status) { if (status) {
switch ((BACNET_NOTIFY_TYPE)value.type.Enumerated) { switch ((BACNET_NOTIFY_TYPE) value.type.Enumerated) {
case NOTIFY_EVENT: case NOTIFY_EVENT:
CurrentAI->Notify_Type = 1; CurrentAI->Notify_Type = 1;
break; break;
@@ -922,17 +922,17 @@ void Analog_Input_Intrinsic_Reporting(
event_data.notificationParams.outOfRange.exceedingValue = event_data.notificationParams.outOfRange.exceedingValue =
PresentVal; PresentVal;
/* Status_Flags of the referenced object. */ /* Status_Flags of the referenced object. */
bitstring_init(&event_data.notificationParams. bitstring_init(&event_data.notificationParams.outOfRange.
outOfRange.statusFlags); statusFlags);
bitstring_set_bit(&event_data.notificationParams. bitstring_set_bit(&event_data.notificationParams.outOfRange.
outOfRange.statusFlags, STATUS_FLAG_IN_ALARM, statusFlags, STATUS_FLAG_IN_ALARM,
CurrentAI->Event_State ? true : false); CurrentAI->Event_State ? true : false);
bitstring_set_bit(&event_data.notificationParams. bitstring_set_bit(&event_data.notificationParams.outOfRange.
outOfRange.statusFlags, STATUS_FLAG_FAULT, false); statusFlags, STATUS_FLAG_FAULT, false);
bitstring_set_bit(&event_data.notificationParams. bitstring_set_bit(&event_data.notificationParams.outOfRange.
outOfRange.statusFlags, STATUS_FLAG_OVERRIDDEN, false); statusFlags, STATUS_FLAG_OVERRIDDEN, false);
bitstring_set_bit(&event_data.notificationParams. bitstring_set_bit(&event_data.notificationParams.outOfRange.
outOfRange.statusFlags, STATUS_FLAG_OUT_OF_SERVICE, statusFlags, STATUS_FLAG_OUT_OF_SERVICE,
CurrentAI->Out_Of_Service); CurrentAI->Out_Of_Service);
/* Deadband used for limit checking. */ /* Deadband used for limit checking. */
event_data.notificationParams.outOfRange.deadband = event_data.notificationParams.outOfRange.deadband =
@@ -952,30 +952,24 @@ void Analog_Input_Intrinsic_Reporting(
case EVENT_STATE_OFFNORMAL: case EVENT_STATE_OFFNORMAL:
case EVENT_STATE_HIGH_LIMIT: case EVENT_STATE_HIGH_LIMIT:
case EVENT_STATE_LOW_LIMIT: case EVENT_STATE_LOW_LIMIT:
CurrentAI-> CurrentAI->Acked_Transitions[TRANSITION_TO_OFFNORMAL].
Acked_Transitions[TRANSITION_TO_OFFNORMAL].bIsAcked = bIsAcked = false;
false; CurrentAI->Acked_Transitions[TRANSITION_TO_OFFNORMAL].
CurrentAI-> Time_Stamp = event_data.timeStamp.value.dateTime;
Acked_Transitions[TRANSITION_TO_OFFNORMAL].Time_Stamp =
event_data.timeStamp.value.dateTime;
break; break;
case EVENT_STATE_FAULT: case EVENT_STATE_FAULT:
CurrentAI-> CurrentAI->Acked_Transitions[TRANSITION_TO_FAULT].
Acked_Transitions[TRANSITION_TO_FAULT].bIsAcked = bIsAcked = false;
false; CurrentAI->Acked_Transitions[TRANSITION_TO_FAULT].
CurrentAI-> Time_Stamp = event_data.timeStamp.value.dateTime;
Acked_Transitions[TRANSITION_TO_FAULT].Time_Stamp =
event_data.timeStamp.value.dateTime;
break; break;
case EVENT_STATE_NORMAL: case EVENT_STATE_NORMAL:
CurrentAI-> CurrentAI->Acked_Transitions[TRANSITION_TO_NORMAL].
Acked_Transitions[TRANSITION_TO_NORMAL].bIsAcked = bIsAcked = false;
false; CurrentAI->Acked_Transitions[TRANSITION_TO_NORMAL].
CurrentAI-> Time_Stamp = event_data.timeStamp.value.dateTime;
Acked_Transitions[TRANSITION_TO_NORMAL].Time_Stamp =
event_data.timeStamp.value.dateTime;
break; break;
} }
} }
@@ -1002,12 +996,12 @@ int Analog_Input_Event_Information(
/* Acked_Transitions property, which has at least one of the bits /* Acked_Transitions property, which has at least one of the bits
(TO-OFFNORMAL, TO-FAULT, TONORMAL) set to FALSE. */ (TO-OFFNORMAL, TO-FAULT, TONORMAL) set to FALSE. */
IsNotAckedTransitions = IsNotAckedTransitions =
(AI_Descr[index]. (AI_Descr[index].Acked_Transitions[TRANSITION_TO_OFFNORMAL].
Acked_Transitions[TRANSITION_TO_OFFNORMAL].bIsAcked == bIsAcked ==
false) | (AI_Descr[index]. false) | (AI_Descr[index].Acked_Transitions[TRANSITION_TO_FAULT].
Acked_Transitions[TRANSITION_TO_FAULT].bIsAcked == bIsAcked ==
false) | (AI_Descr[index]. false) | (AI_Descr[index].Acked_Transitions[TRANSITION_TO_NORMAL].
Acked_Transitions[TRANSITION_TO_NORMAL].bIsAcked == false); bIsAcked == false);
} else } else
return -1; /* end of list */ return -1; /* end of list */
@@ -1022,8 +1016,8 @@ int Analog_Input_Event_Information(
bitstring_init(&getevent_data->acknowledgedTransitions); bitstring_init(&getevent_data->acknowledgedTransitions);
bitstring_set_bit(&getevent_data->acknowledgedTransitions, bitstring_set_bit(&getevent_data->acknowledgedTransitions,
TRANSITION_TO_OFFNORMAL, TRANSITION_TO_OFFNORMAL,
AI_Descr[index]. AI_Descr[index].Acked_Transitions[TRANSITION_TO_OFFNORMAL].
Acked_Transitions[TRANSITION_TO_OFFNORMAL].bIsAcked); bIsAcked);
bitstring_set_bit(&getevent_data->acknowledgedTransitions, bitstring_set_bit(&getevent_data->acknowledgedTransitions,
TRANSITION_TO_FAULT, TRANSITION_TO_FAULT,
AI_Descr[index].Acked_Transitions[TRANSITION_TO_FAULT].bIsAcked); AI_Descr[index].Acked_Transitions[TRANSITION_TO_FAULT].bIsAcked);
@@ -1041,14 +1035,14 @@ int Analog_Input_Event_Information(
/* Event Enable */ /* Event Enable */
bitstring_init(&getevent_data->eventEnable); bitstring_init(&getevent_data->eventEnable);
bitstring_set_bit(&getevent_data->eventEnable, TRANSITION_TO_OFFNORMAL, bitstring_set_bit(&getevent_data->eventEnable, TRANSITION_TO_OFFNORMAL,
(AI_Descr[index].Event_Enable & EVENT_ENABLE_TO_OFFNORMAL) ? true : (AI_Descr[index].
false); Event_Enable & EVENT_ENABLE_TO_OFFNORMAL) ? true : false);
bitstring_set_bit(&getevent_data->eventEnable, TRANSITION_TO_FAULT, bitstring_set_bit(&getevent_data->eventEnable, TRANSITION_TO_FAULT,
(AI_Descr[index].Event_Enable & EVENT_ENABLE_TO_FAULT) ? true : (AI_Descr[index].
false); Event_Enable & EVENT_ENABLE_TO_FAULT) ? true : false);
bitstring_set_bit(&getevent_data->eventEnable, TRANSITION_TO_NORMAL, bitstring_set_bit(&getevent_data->eventEnable, TRANSITION_TO_NORMAL,
(AI_Descr[index].Event_Enable & EVENT_ENABLE_TO_NORMAL) ? true : (AI_Descr[index].
false); Event_Enable & EVENT_ENABLE_TO_NORMAL) ? true : false);
/* Event Priorities */ /* Event Priorities */
Notification_Class_Get_Priorities(AI_Descr[index].Notification_Class, Notification_Class_Get_Priorities(AI_Descr[index].Notification_Class,
getevent_data->eventPriorities); getevent_data->eventPriorities);
@@ -1068,8 +1062,8 @@ int Analog_Input_Alarm_Ack(
object_index = object_index =
Analog_Input_Instance_To_Index(alarmack_data-> Analog_Input_Instance_To_Index(alarmack_data->eventObjectIdentifier.
eventObjectIdentifier.instance); instance);
if (object_index < MAX_ANALOG_INPUTS) if (object_index < MAX_ANALOG_INPUTS)
CurrentAI = &AI_Descr[object_index]; CurrentAI = &AI_Descr[object_index];
@@ -1082,22 +1076,22 @@ int Analog_Input_Alarm_Ack(
case EVENT_STATE_OFFNORMAL: case EVENT_STATE_OFFNORMAL:
case EVENT_STATE_HIGH_LIMIT: case EVENT_STATE_HIGH_LIMIT:
case EVENT_STATE_LOW_LIMIT: case EVENT_STATE_LOW_LIMIT:
if (CurrentAI-> if (CurrentAI->Acked_Transitions[TRANSITION_TO_OFFNORMAL].
Acked_Transitions[TRANSITION_TO_OFFNORMAL].bIsAcked == false) { bIsAcked == false) {
if (alarmack_data->eventTimeStamp.tag != TIME_STAMP_DATETIME) { if (alarmack_data->eventTimeStamp.tag != TIME_STAMP_DATETIME) {
*error_code = ERROR_CODE_INVALID_TIME_STAMP; *error_code = ERROR_CODE_INVALID_TIME_STAMP;
return -1; return -1;
} }
if (datetime_compare(&CurrentAI->Acked_Transitions if (datetime_compare(&CurrentAI->
[TRANSITION_TO_OFFNORMAL].Time_Stamp, Acked_Transitions[TRANSITION_TO_OFFNORMAL].Time_Stamp,
&alarmack_data->eventTimeStamp.value.dateTime) > 0) { &alarmack_data->eventTimeStamp.value.dateTime) > 0) {
*error_code = ERROR_CODE_INVALID_TIME_STAMP; *error_code = ERROR_CODE_INVALID_TIME_STAMP;
return -1; return -1;
} }
/* FIXME: Send ack notification */ /* FIXME: Send ack notification */
CurrentAI-> CurrentAI->Acked_Transitions[TRANSITION_TO_OFFNORMAL].
Acked_Transitions[TRANSITION_TO_OFFNORMAL].bIsAcked = true; bIsAcked = true;
} else { } else {
*error_code = ERROR_CODE_INVALID_EVENT_STATE; *error_code = ERROR_CODE_INVALID_EVENT_STATE;
return -1; return -1;
@@ -1111,8 +1105,8 @@ int Analog_Input_Alarm_Ack(
*error_code = ERROR_CODE_INVALID_TIME_STAMP; *error_code = ERROR_CODE_INVALID_TIME_STAMP;
return -1; return -1;
} }
if (datetime_compare(&CurrentAI->Acked_Transitions if (datetime_compare(&CurrentAI->
[TRANSITION_TO_FAULT].Time_Stamp, Acked_Transitions[TRANSITION_TO_FAULT].Time_Stamp,
&alarmack_data->eventTimeStamp.value.dateTime) > 0) { &alarmack_data->eventTimeStamp.value.dateTime) > 0) {
*error_code = ERROR_CODE_INVALID_TIME_STAMP; *error_code = ERROR_CODE_INVALID_TIME_STAMP;
return -1; return -1;
@@ -1134,8 +1128,8 @@ int Analog_Input_Alarm_Ack(
*error_code = ERROR_CODE_INVALID_TIME_STAMP; *error_code = ERROR_CODE_INVALID_TIME_STAMP;
return -1; return -1;
} }
if (datetime_compare(&CurrentAI->Acked_Transitions if (datetime_compare(&CurrentAI->
[TRANSITION_TO_NORMAL].Time_Stamp, Acked_Transitions[TRANSITION_TO_NORMAL].Time_Stamp,
&alarmack_data->eventTimeStamp.value.dateTime) > 0) { &alarmack_data->eventTimeStamp.value.dateTime) > 0) {
*error_code = ERROR_CODE_INVALID_TIME_STAMP; *error_code = ERROR_CODE_INVALID_TIME_STAMP;
return -1; return -1;
@@ -1180,16 +1174,16 @@ int Analog_Input_Alarm_Summary(
bitstring_init(&getalarm_data->acknowledgedTransitions); bitstring_init(&getalarm_data->acknowledgedTransitions);
bitstring_set_bit(&getalarm_data->acknowledgedTransitions, bitstring_set_bit(&getalarm_data->acknowledgedTransitions,
TRANSITION_TO_OFFNORMAL, TRANSITION_TO_OFFNORMAL,
AI_Descr[index]. AI_Descr[index].Acked_Transitions[TRANSITION_TO_OFFNORMAL].
Acked_Transitions[TRANSITION_TO_OFFNORMAL].bIsAcked); bIsAcked);
bitstring_set_bit(&getalarm_data->acknowledgedTransitions, bitstring_set_bit(&getalarm_data->acknowledgedTransitions,
TRANSITION_TO_FAULT, TRANSITION_TO_FAULT,
AI_Descr[index].Acked_Transitions[TRANSITION_TO_FAULT]. AI_Descr[index].
bIsAcked); Acked_Transitions[TRANSITION_TO_FAULT].bIsAcked);
bitstring_set_bit(&getalarm_data->acknowledgedTransitions, bitstring_set_bit(&getalarm_data->acknowledgedTransitions,
TRANSITION_TO_NORMAL, TRANSITION_TO_NORMAL,
AI_Descr[index].Acked_Transitions[TRANSITION_TO_NORMAL]. AI_Descr[index].
bIsAcked); Acked_Transitions[TRANSITION_TO_NORMAL].bIsAcked);
return 1; /* active alarm */ return 1; /* active alarm */
} else } else
+4 -4
View File
@@ -451,11 +451,11 @@ bool Analog_Output_Write_Property(
&wp_data->error_class, &wp_data->error_code); &wp_data->error_class, &wp_data->error_code);
if (status) { if (status) {
object_index = object_index =
Analog_Output_Instance_To_Index(wp_data-> Analog_Output_Instance_To_Index
object_instance); (wp_data->object_instance);
status = status =
Analog_Output_Present_Value_Relinquish(wp_data-> Analog_Output_Present_Value_Relinquish
object_instance, wp_data->priority); (wp_data->object_instance, wp_data->priority);
if (!status) { if (!status) {
wp_data->error_class = ERROR_CLASS_PROPERTY; wp_data->error_class = ERROR_CLASS_PROPERTY;
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
+67 -73
View File
@@ -424,11 +424,11 @@ int Analog_Value_Read_Property(
case PROP_LIMIT_ENABLE: case PROP_LIMIT_ENABLE:
bitstring_init(&bit_string); bitstring_init(&bit_string);
bitstring_set_bit(&bit_string, 0, bitstring_set_bit(&bit_string, 0,
(CurrentAV->Limit_Enable & EVENT_LOW_LIMIT_ENABLE) ? true : (CurrentAV->
false); Limit_Enable & EVENT_LOW_LIMIT_ENABLE) ? true : false);
bitstring_set_bit(&bit_string, 1, bitstring_set_bit(&bit_string, 1,
(CurrentAV->Limit_Enable & EVENT_HIGH_LIMIT_ENABLE) ? true : (CurrentAV->
false); Limit_Enable & EVENT_HIGH_LIMIT_ENABLE) ? true : false);
apdu_len = encode_application_bitstring(&apdu[0], &bit_string); apdu_len = encode_application_bitstring(&apdu[0], &bit_string);
break; break;
@@ -436,14 +436,14 @@ int Analog_Value_Read_Property(
case PROP_EVENT_ENABLE: case PROP_EVENT_ENABLE:
bitstring_init(&bit_string); bitstring_init(&bit_string);
bitstring_set_bit(&bit_string, TRANSITION_TO_OFFNORMAL, bitstring_set_bit(&bit_string, TRANSITION_TO_OFFNORMAL,
(CurrentAV->Event_Enable & EVENT_ENABLE_TO_OFFNORMAL) ? true : (CurrentAV->
false); Event_Enable & EVENT_ENABLE_TO_OFFNORMAL) ? true : false);
bitstring_set_bit(&bit_string, TRANSITION_TO_FAULT, bitstring_set_bit(&bit_string, TRANSITION_TO_FAULT,
(CurrentAV->Event_Enable & EVENT_ENABLE_TO_FAULT) ? true : (CurrentAV->
false); Event_Enable & EVENT_ENABLE_TO_FAULT) ? true : false);
bitstring_set_bit(&bit_string, TRANSITION_TO_NORMAL, bitstring_set_bit(&bit_string, TRANSITION_TO_NORMAL,
(CurrentAV->Event_Enable & EVENT_ENABLE_TO_NORMAL) ? true : (CurrentAV->
false); Event_Enable & EVENT_ENABLE_TO_NORMAL) ? true : false);
apdu_len = encode_application_bitstring(&apdu[0], &bit_string); apdu_len = encode_application_bitstring(&apdu[0], &bit_string);
break; break;
@@ -451,8 +451,8 @@ int Analog_Value_Read_Property(
case PROP_ACKED_TRANSITIONS: case PROP_ACKED_TRANSITIONS:
bitstring_init(&bit_string); bitstring_init(&bit_string);
bitstring_set_bit(&bit_string, TRANSITION_TO_OFFNORMAL, bitstring_set_bit(&bit_string, TRANSITION_TO_OFFNORMAL,
CurrentAV-> CurrentAV->Acked_Transitions[TRANSITION_TO_OFFNORMAL].
Acked_Transitions[TRANSITION_TO_OFFNORMAL].bIsAcked); bIsAcked);
bitstring_set_bit(&bit_string, TRANSITION_TO_FAULT, bitstring_set_bit(&bit_string, TRANSITION_TO_FAULT,
CurrentAV->Acked_Transitions[TRANSITION_TO_FAULT].bIsAcked); CurrentAV->Acked_Transitions[TRANSITION_TO_FAULT].bIsAcked);
bitstring_set_bit(&bit_string, TRANSITION_TO_NORMAL, bitstring_set_bit(&bit_string, TRANSITION_TO_NORMAL,
@@ -735,7 +735,7 @@ bool Analog_Value_Write_Property(
&wp_data->error_class, &wp_data->error_code); &wp_data->error_class, &wp_data->error_code);
if (status) { if (status) {
switch ((BACNET_NOTIFY_TYPE)value.type.Enumerated) { switch ((BACNET_NOTIFY_TYPE) value.type.Enumerated) {
case NOTIFY_EVENT: case NOTIFY_EVENT:
CurrentAV->Notify_Type = 1; CurrentAV->Notify_Type = 1;
break; break;
@@ -1017,17 +1017,17 @@ void Analog_Value_Intrinsic_Reporting(
event_data.notificationParams.outOfRange.exceedingValue = event_data.notificationParams.outOfRange.exceedingValue =
PresentVal; PresentVal;
/* Status_Flags of the referenced object. */ /* Status_Flags of the referenced object. */
bitstring_init(&event_data.notificationParams. bitstring_init(&event_data.notificationParams.outOfRange.
outOfRange.statusFlags); statusFlags);
bitstring_set_bit(&event_data.notificationParams. bitstring_set_bit(&event_data.notificationParams.outOfRange.
outOfRange.statusFlags, STATUS_FLAG_IN_ALARM, statusFlags, STATUS_FLAG_IN_ALARM,
CurrentAV->Event_State ? true : false); CurrentAV->Event_State ? true : false);
bitstring_set_bit(&event_data.notificationParams. bitstring_set_bit(&event_data.notificationParams.outOfRange.
outOfRange.statusFlags, STATUS_FLAG_FAULT, false); statusFlags, STATUS_FLAG_FAULT, false);
bitstring_set_bit(&event_data.notificationParams. bitstring_set_bit(&event_data.notificationParams.outOfRange.
outOfRange.statusFlags, STATUS_FLAG_OVERRIDDEN, false); statusFlags, STATUS_FLAG_OVERRIDDEN, false);
bitstring_set_bit(&event_data.notificationParams. bitstring_set_bit(&event_data.notificationParams.outOfRange.
outOfRange.statusFlags, STATUS_FLAG_OUT_OF_SERVICE, statusFlags, STATUS_FLAG_OUT_OF_SERVICE,
CurrentAV->Out_Of_Service); CurrentAV->Out_Of_Service);
/* Deadband used for limit checking. */ /* Deadband used for limit checking. */
event_data.notificationParams.outOfRange.deadband = event_data.notificationParams.outOfRange.deadband =
@@ -1047,30 +1047,24 @@ void Analog_Value_Intrinsic_Reporting(
case EVENT_STATE_OFFNORMAL: case EVENT_STATE_OFFNORMAL:
case EVENT_STATE_HIGH_LIMIT: case EVENT_STATE_HIGH_LIMIT:
case EVENT_STATE_LOW_LIMIT: case EVENT_STATE_LOW_LIMIT:
CurrentAV-> CurrentAV->Acked_Transitions[TRANSITION_TO_OFFNORMAL].
Acked_Transitions[TRANSITION_TO_OFFNORMAL].bIsAcked = bIsAcked = false;
false; CurrentAV->Acked_Transitions[TRANSITION_TO_OFFNORMAL].
CurrentAV-> Time_Stamp = event_data.timeStamp.value.dateTime;
Acked_Transitions[TRANSITION_TO_OFFNORMAL].Time_Stamp =
event_data.timeStamp.value.dateTime;
break; break;
case EVENT_STATE_FAULT: case EVENT_STATE_FAULT:
CurrentAV-> CurrentAV->Acked_Transitions[TRANSITION_TO_FAULT].
Acked_Transitions[TRANSITION_TO_FAULT].bIsAcked = bIsAcked = false;
false; CurrentAV->Acked_Transitions[TRANSITION_TO_FAULT].
CurrentAV-> Time_Stamp = event_data.timeStamp.value.dateTime;
Acked_Transitions[TRANSITION_TO_FAULT].Time_Stamp =
event_data.timeStamp.value.dateTime;
break; break;
case EVENT_STATE_NORMAL: case EVENT_STATE_NORMAL:
CurrentAV-> CurrentAV->Acked_Transitions[TRANSITION_TO_NORMAL].
Acked_Transitions[TRANSITION_TO_NORMAL].bIsAcked = bIsAcked = false;
false; CurrentAV->Acked_Transitions[TRANSITION_TO_NORMAL].
CurrentAV-> Time_Stamp = event_data.timeStamp.value.dateTime;
Acked_Transitions[TRANSITION_TO_NORMAL].Time_Stamp =
event_data.timeStamp.value.dateTime;
break; break;
} }
} }
@@ -1097,12 +1091,12 @@ int Analog_Value_Event_Information(
/* Acked_Transitions property, which has at least one of the bits /* Acked_Transitions property, which has at least one of the bits
(TO-OFFNORMAL, TO-FAULT, TONORMAL) set to FALSE. */ (TO-OFFNORMAL, TO-FAULT, TONORMAL) set to FALSE. */
IsNotAckedTransitions = IsNotAckedTransitions =
(AV_Descr[index]. (AV_Descr[index].Acked_Transitions[TRANSITION_TO_OFFNORMAL].
Acked_Transitions[TRANSITION_TO_OFFNORMAL].bIsAcked == bIsAcked ==
false) | (AV_Descr[index]. false) | (AV_Descr[index].Acked_Transitions[TRANSITION_TO_FAULT].
Acked_Transitions[TRANSITION_TO_FAULT].bIsAcked == bIsAcked ==
false) | (AV_Descr[index]. false) | (AV_Descr[index].Acked_Transitions[TRANSITION_TO_NORMAL].
Acked_Transitions[TRANSITION_TO_NORMAL].bIsAcked == false); bIsAcked == false);
} else } else
return -1; /* end of list */ return -1; /* end of list */
@@ -1117,8 +1111,8 @@ int Analog_Value_Event_Information(
bitstring_init(&getevent_data->acknowledgedTransitions); bitstring_init(&getevent_data->acknowledgedTransitions);
bitstring_set_bit(&getevent_data->acknowledgedTransitions, bitstring_set_bit(&getevent_data->acknowledgedTransitions,
TRANSITION_TO_OFFNORMAL, TRANSITION_TO_OFFNORMAL,
AV_Descr[index]. AV_Descr[index].Acked_Transitions[TRANSITION_TO_OFFNORMAL].
Acked_Transitions[TRANSITION_TO_OFFNORMAL].bIsAcked); bIsAcked);
bitstring_set_bit(&getevent_data->acknowledgedTransitions, bitstring_set_bit(&getevent_data->acknowledgedTransitions,
TRANSITION_TO_FAULT, TRANSITION_TO_FAULT,
AV_Descr[index].Acked_Transitions[TRANSITION_TO_FAULT].bIsAcked); AV_Descr[index].Acked_Transitions[TRANSITION_TO_FAULT].bIsAcked);
@@ -1136,14 +1130,14 @@ int Analog_Value_Event_Information(
/* Event Enable */ /* Event Enable */
bitstring_init(&getevent_data->eventEnable); bitstring_init(&getevent_data->eventEnable);
bitstring_set_bit(&getevent_data->eventEnable, TRANSITION_TO_OFFNORMAL, bitstring_set_bit(&getevent_data->eventEnable, TRANSITION_TO_OFFNORMAL,
(AV_Descr[index].Event_Enable & EVENT_ENABLE_TO_OFFNORMAL) ? true : (AV_Descr[index].
false); Event_Enable & EVENT_ENABLE_TO_OFFNORMAL) ? true : false);
bitstring_set_bit(&getevent_data->eventEnable, TRANSITION_TO_FAULT, bitstring_set_bit(&getevent_data->eventEnable, TRANSITION_TO_FAULT,
(AV_Descr[index].Event_Enable & EVENT_ENABLE_TO_FAULT) ? true : (AV_Descr[index].
false); Event_Enable & EVENT_ENABLE_TO_FAULT) ? true : false);
bitstring_set_bit(&getevent_data->eventEnable, TRANSITION_TO_NORMAL, bitstring_set_bit(&getevent_data->eventEnable, TRANSITION_TO_NORMAL,
(AV_Descr[index].Event_Enable & EVENT_ENABLE_TO_NORMAL) ? true : (AV_Descr[index].
false); Event_Enable & EVENT_ENABLE_TO_NORMAL) ? true : false);
/* Event Priorities */ /* Event Priorities */
Notification_Class_Get_Priorities(AV_Descr[index].Notification_Class, Notification_Class_Get_Priorities(AV_Descr[index].Notification_Class,
getevent_data->eventPriorities); getevent_data->eventPriorities);
@@ -1162,8 +1156,8 @@ int Analog_Value_Alarm_Ack(
object_index = object_index =
Analog_Value_Instance_To_Index(alarmack_data-> Analog_Value_Instance_To_Index(alarmack_data->eventObjectIdentifier.
eventObjectIdentifier.instance); instance);
if (object_index < MAX_ANALOG_VALUES) if (object_index < MAX_ANALOG_VALUES)
CurrentAV = &AV_Descr[object_index]; CurrentAV = &AV_Descr[object_index];
@@ -1176,22 +1170,22 @@ int Analog_Value_Alarm_Ack(
case EVENT_STATE_OFFNORMAL: case EVENT_STATE_OFFNORMAL:
case EVENT_STATE_HIGH_LIMIT: case EVENT_STATE_HIGH_LIMIT:
case EVENT_STATE_LOW_LIMIT: case EVENT_STATE_LOW_LIMIT:
if (CurrentAV-> if (CurrentAV->Acked_Transitions[TRANSITION_TO_OFFNORMAL].
Acked_Transitions[TRANSITION_TO_OFFNORMAL].bIsAcked == false) { bIsAcked == false) {
if (alarmack_data->eventTimeStamp.tag != TIME_STAMP_DATETIME) { if (alarmack_data->eventTimeStamp.tag != TIME_STAMP_DATETIME) {
*error_code = ERROR_CODE_INVALID_TIME_STAMP; *error_code = ERROR_CODE_INVALID_TIME_STAMP;
return -1; return -1;
} }
if (datetime_compare(&CurrentAV->Acked_Transitions if (datetime_compare(&CurrentAV->
[TRANSITION_TO_OFFNORMAL].Time_Stamp, Acked_Transitions[TRANSITION_TO_OFFNORMAL].Time_Stamp,
&alarmack_data->eventTimeStamp.value.dateTime) > 0) { &alarmack_data->eventTimeStamp.value.dateTime) > 0) {
*error_code = ERROR_CODE_INVALID_TIME_STAMP; *error_code = ERROR_CODE_INVALID_TIME_STAMP;
return -1; return -1;
} }
/* Clean transitions flag. */ /* Clean transitions flag. */
CurrentAV-> CurrentAV->Acked_Transitions[TRANSITION_TO_OFFNORMAL].
Acked_Transitions[TRANSITION_TO_OFFNORMAL].bIsAcked = true; bIsAcked = true;
} else { } else {
*error_code = ERROR_CODE_INVALID_EVENT_STATE; *error_code = ERROR_CODE_INVALID_EVENT_STATE;
return -1; return -1;
@@ -1205,8 +1199,8 @@ int Analog_Value_Alarm_Ack(
*error_code = ERROR_CODE_INVALID_TIME_STAMP; *error_code = ERROR_CODE_INVALID_TIME_STAMP;
return -1; return -1;
} }
if (datetime_compare(&CurrentAV->Acked_Transitions if (datetime_compare(&CurrentAV->
[TRANSITION_TO_NORMAL].Time_Stamp, Acked_Transitions[TRANSITION_TO_NORMAL].Time_Stamp,
&alarmack_data->eventTimeStamp.value.dateTime) > 0) { &alarmack_data->eventTimeStamp.value.dateTime) > 0) {
*error_code = ERROR_CODE_INVALID_TIME_STAMP; *error_code = ERROR_CODE_INVALID_TIME_STAMP;
return -1; return -1;
@@ -1228,8 +1222,8 @@ int Analog_Value_Alarm_Ack(
*error_code = ERROR_CODE_INVALID_TIME_STAMP; *error_code = ERROR_CODE_INVALID_TIME_STAMP;
return -1; return -1;
} }
if (datetime_compare(&CurrentAV->Acked_Transitions if (datetime_compare(&CurrentAV->
[TRANSITION_TO_FAULT].Time_Stamp, Acked_Transitions[TRANSITION_TO_FAULT].Time_Stamp,
&alarmack_data->eventTimeStamp.value.dateTime) > 0) { &alarmack_data->eventTimeStamp.value.dateTime) > 0) {
*error_code = ERROR_CODE_INVALID_TIME_STAMP; *error_code = ERROR_CODE_INVALID_TIME_STAMP;
return -1; return -1;
@@ -1277,16 +1271,16 @@ int Analog_Value_Alarm_Summary(
bitstring_init(&getalarm_data->acknowledgedTransitions); bitstring_init(&getalarm_data->acknowledgedTransitions);
bitstring_set_bit(&getalarm_data->acknowledgedTransitions, bitstring_set_bit(&getalarm_data->acknowledgedTransitions,
TRANSITION_TO_OFFNORMAL, TRANSITION_TO_OFFNORMAL,
AV_Descr[index]. AV_Descr[index].Acked_Transitions[TRANSITION_TO_OFFNORMAL].
Acked_Transitions[TRANSITION_TO_OFFNORMAL].bIsAcked); bIsAcked);
bitstring_set_bit(&getalarm_data->acknowledgedTransitions, bitstring_set_bit(&getalarm_data->acknowledgedTransitions,
TRANSITION_TO_FAULT, TRANSITION_TO_FAULT,
AV_Descr[index].Acked_Transitions[TRANSITION_TO_FAULT]. AV_Descr[index].
bIsAcked); Acked_Transitions[TRANSITION_TO_FAULT].bIsAcked);
bitstring_set_bit(&getalarm_data->acknowledgedTransitions, bitstring_set_bit(&getalarm_data->acknowledgedTransitions,
TRANSITION_TO_NORMAL, TRANSITION_TO_NORMAL,
AV_Descr[index].Acked_Transitions[TRANSITION_TO_NORMAL]. AV_Descr[index].
bIsAcked); Acked_Transitions[TRANSITION_TO_NORMAL].bIsAcked);
return 1; /* active alarm */ return 1; /* active alarm */
} else } else
+4 -4
View File
@@ -383,8 +383,8 @@ bool Binary_Output_Write_Property(
(value.type.Enumerated <= MAX_BINARY_PV)) { (value.type.Enumerated <= MAX_BINARY_PV)) {
level = (BACNET_BINARY_PV) value.type.Enumerated; level = (BACNET_BINARY_PV) value.type.Enumerated;
object_index = object_index =
Binary_Output_Instance_To_Index(wp_data-> Binary_Output_Instance_To_Index
object_instance); (wp_data->object_instance);
priority--; priority--;
Binary_Output_Level[object_index][priority] = level; Binary_Output_Level[object_index][priority] = level;
/* Note: you could set the physical output here if we /* Note: you could set the physical output here if we
@@ -410,8 +410,8 @@ bool Binary_Output_Write_Property(
if (status) { if (status) {
level = BINARY_NULL; level = BINARY_NULL;
object_index = object_index =
Binary_Output_Instance_To_Index(wp_data-> Binary_Output_Instance_To_Index
object_instance); (wp_data->object_instance);
priority = wp_data->priority; priority = wp_data->priority;
if (priority && (priority <= BACNET_MAX_PRIORITY)) { if (priority && (priority <= BACNET_MAX_PRIORITY)) {
priority--; priority--;
+4 -4
View File
@@ -366,8 +366,8 @@ bool Binary_Value_Write_Property(
(value.type.Enumerated <= MAX_BINARY_PV)) { (value.type.Enumerated <= MAX_BINARY_PV)) {
level = (BACNET_BINARY_PV) value.type.Enumerated; level = (BACNET_BINARY_PV) value.type.Enumerated;
object_index = object_index =
Binary_Value_Instance_To_Index(wp_data-> Binary_Value_Instance_To_Index
object_instance); (wp_data->object_instance);
priority--; priority--;
Binary_Value_Level[object_index][priority] = level; Binary_Value_Level[object_index][priority] = level;
/* Note: you could set the physical output here if we /* Note: you could set the physical output here if we
@@ -393,8 +393,8 @@ bool Binary_Value_Write_Property(
if (status) { if (status) {
level = BINARY_NULL; level = BINARY_NULL;
object_index = object_index =
Binary_Value_Instance_To_Index(wp_data-> Binary_Value_Instance_To_Index
object_instance); (wp_data->object_instance);
priority = wp_data->priority; priority = wp_data->priority;
if (priority && (priority <= BACNET_MAX_PRIORITY)) { if (priority && (priority <= BACNET_MAX_PRIORITY)) {
priority--; priority--;
+6 -6
View File
@@ -357,8 +357,8 @@ int CharacterString_Value_Read_Property(
break; break;
case PROP_OUT_OF_SERVICE: case PROP_OUT_OF_SERVICE:
object_index = object_index =
CharacterString_Value_Instance_To_Index(rpdata-> CharacterString_Value_Instance_To_Index
object_instance); (rpdata->object_instance);
state = Out_Of_Service[object_index]; state = Out_Of_Service[object_index];
apdu_len = encode_application_boolean(&apdu[0], state); apdu_len = encode_application_boolean(&apdu[0], state);
break; break;
@@ -406,8 +406,8 @@ bool CharacterString_Value_Write_Property(
&wp_data->error_code); &wp_data->error_code);
if (status) { if (status) {
status = status =
CharacterString_Value_Present_Value_Set(wp_data-> CharacterString_Value_Present_Value_Set
object_instance, &value.type.Character_String); (wp_data->object_instance, &value.type.Character_String);
if (!status) { if (!status) {
wp_data->error_class = ERROR_CLASS_PROPERTY; wp_data->error_class = ERROR_CLASS_PROPERTY;
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
@@ -419,8 +419,8 @@ bool CharacterString_Value_Write_Property(
WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN, WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
&wp_data->error_class, &wp_data->error_code); &wp_data->error_class, &wp_data->error_code);
if (status) { if (status) {
CharacterString_Value_Out_Of_Service_Set(wp_data-> CharacterString_Value_Out_Of_Service_Set
object_instance, value.type.Boolean); (wp_data->object_instance, value.type.Boolean);
} }
break; break;
case PROP_OBJECT_IDENTIFIER: case PROP_OBJECT_IDENTIFIER:
+15 -15
View File
@@ -1161,8 +1161,8 @@ int Device_Read_Property_Local(
{ {
int apdu_len = 0; /* return value */ int apdu_len = 0; /* return value */
int len = 0; /* apdu len intermediate value */ int len = 0; /* apdu len intermediate value */
BACNET_BIT_STRING bit_string = {0}; BACNET_BIT_STRING bit_string = { 0 };
BACNET_CHARACTER_STRING char_string = {0}; BACNET_CHARACTER_STRING char_string = { 0 };
unsigned i = 0; unsigned i = 0;
int object_type = 0; int object_type = 0;
uint32_t instance = 0; uint32_t instance = 0;
@@ -1454,8 +1454,8 @@ bool Device_Write_Property_Local(
&wp_data->error_class, &wp_data->error_code); &wp_data->error_class, &wp_data->error_code);
if (status) { if (status) {
if ((value.type.Object_Id.type == OBJECT_DEVICE) && if ((value.type.Object_Id.type == OBJECT_DEVICE) &&
(Device_Set_Object_Instance_Number(value.type.Object_Id. (Device_Set_Object_Instance_Number(value.type.
instance))) { Object_Id.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 */
} else { } else {
status = false; status = false;
@@ -1488,8 +1488,8 @@ bool Device_Write_Property_Local(
&wp_data->error_class, &wp_data->error_code); &wp_data->error_class, &wp_data->error_code);
if (status) { if (status) {
/* FIXME: bounds check? */ /* FIXME: bounds check? */
Device_Set_Vendor_Identifier((uint16_t) value.type. Device_Set_Vendor_Identifier((uint16_t) value.
Unsigned_Int); type.Unsigned_Int);
} }
break; break;
case PROP_SYSTEM_STATUS: case PROP_SYSTEM_STATUS:
@@ -1519,7 +1519,7 @@ bool Device_Write_Property_Local(
if (status) { if (status) {
/* All the object names in a device must be unique */ /* All the object names in a device must be unique */
if (Device_Valid_Object_Name(&value.type.Character_String, if (Device_Valid_Object_Name(&value.type.Character_String,
&object_type, &object_instance)) { &object_type, &object_instance)) {
if ((object_type == wp_data->object_type) && if ((object_type == wp_data->object_type) &&
(object_instance == wp_data->object_instance)) { (object_instance == wp_data->object_instance)) {
/* writing same name to same object */ /* writing same name to same object */
@@ -1539,8 +1539,8 @@ bool Device_Write_Property_Local(
WPValidateString(&value, MAX_DEV_LOC_LEN, true, WPValidateString(&value, MAX_DEV_LOC_LEN, true,
&wp_data->error_class, &wp_data->error_code); &wp_data->error_class, &wp_data->error_code);
if (status) { if (status) {
Device_Set_Location(characterstring_value(&value.type. Device_Set_Location(characterstring_value(&value.
Character_String), type.Character_String),
characterstring_length(&value.type.Character_String)); characterstring_length(&value.type.Character_String));
} }
break; break;
@@ -1550,8 +1550,8 @@ bool Device_Write_Property_Local(
WPValidateString(&value, MAX_DEV_DESC_LEN, true, WPValidateString(&value, MAX_DEV_DESC_LEN, true,
&wp_data->error_class, &wp_data->error_code); &wp_data->error_class, &wp_data->error_code);
if (status) { if (status) {
Device_Set_Description(characterstring_value(&value.type. Device_Set_Description(characterstring_value(&value.
Character_String), type.Character_String),
characterstring_length(&value.type.Character_String)); characterstring_length(&value.type.Character_String));
} }
break; break;
@@ -1560,8 +1560,8 @@ bool Device_Write_Property_Local(
WPValidateString(&value, MAX_DEV_MOD_LEN, true, WPValidateString(&value, MAX_DEV_MOD_LEN, true,
&wp_data->error_class, &wp_data->error_code); &wp_data->error_class, &wp_data->error_code);
if (status) { if (status) {
Device_Set_Model_Name(characterstring_value(&value.type. Device_Set_Model_Name(characterstring_value(&value.
Character_String), type.Character_String),
characterstring_length(&value.type.Character_String)); characterstring_length(&value.type.Character_String));
} }
break; break;
@@ -1573,8 +1573,8 @@ bool Device_Write_Property_Local(
&wp_data->error_class, &wp_data->error_code); &wp_data->error_class, &wp_data->error_code);
if (status) { if (status) {
if (value.type.Unsigned_Int <= 255) { if (value.type.Unsigned_Int <= 255) {
dlmstp_set_max_info_frames((uint8_t) value.type. dlmstp_set_max_info_frames((uint8_t) value.
Unsigned_Int); type.Unsigned_Int);
} else { } else {
status = false; status = false;
wp_data->error_class = ERROR_CLASS_PROPERTY; wp_data->error_class = ERROR_CLASS_PROPERTY;
+2 -6
View File
@@ -440,15 +440,11 @@ extern "C" {
* - The interface between the implemented Objects and the BAC-stack services, * - The interface between the implemented Objects and the BAC-stack services,
* specifically the handlers, which are mediated through function calls to * specifically the handlers, which are mediated through function calls to
* the Device object. * the Device object.
*/ *//** @defgroup ObjHelpers Object Helper Functions
/** @defgroup ObjHelpers Object Helper Functions
* @ingroup ObjFrmwk * @ingroup ObjFrmwk
* This section describes the function templates for the helper functions that * This section describes the function templates for the helper functions that
* provide common object support. * provide common object support.
*/ *//** @defgroup ObjIntf Handler-to-Object Interface Functions
/** @defgroup ObjIntf Handler-to-Object Interface Functions
* @ingroup ObjFrmwk * @ingroup ObjFrmwk
* This section describes the fairly limited set of functions that link the * This section describes the fairly limited set of functions that link the
* BAC-stack handlers to the BACnet Object instances. All of these calls are * BAC-stack handlers to the BACnet Object instances. All of these calls are
+4 -4
View File
@@ -492,8 +492,8 @@ bool Routed_Device_Write_Property_Local(
&wp_data->error_class, &wp_data->error_code); &wp_data->error_class, &wp_data->error_code);
if (status) { if (status) {
if ((value.type.Object_Id.type == OBJECT_DEVICE) && if ((value.type.Object_Id.type == OBJECT_DEVICE) &&
(Routed_Device_Set_Object_Instance_Number(value. (Routed_Device_Set_Object_Instance_Number(value.type.
type.Object_Id.instance))) { Object_Id.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 */
} else { } else {
status = false; status = false;
@@ -507,8 +507,8 @@ bool Routed_Device_Write_Property_Local(
WPValidateString(&value, MAX_DEV_NAME_LEN, false, WPValidateString(&value, MAX_DEV_NAME_LEN, false,
&wp_data->error_class, &wp_data->error_code); &wp_data->error_class, &wp_data->error_code);
if (status) { if (status) {
Routed_Device_Set_Object_Name(characterstring_encoding Routed_Device_Set_Object_Name(characterstring_encoding(&value.
(&value.type.Character_String), type.Character_String),
characterstring_value(&value.type.Character_String), characterstring_value(&value.type.Character_String),
characterstring_length(&value.type.Character_String)); characterstring_length(&value.type.Character_String));
} }
+8 -8
View File
@@ -466,8 +466,8 @@ int Lighting_Output_Read_Property(
object_index = object_index =
Lighting_Output_Instance_To_Index(rpdata->object_instance); Lighting_Output_Instance_To_Index(rpdata->object_instance);
if (rpdata->array_index <= BACNET_MAX_PRIORITY) { if (rpdata->array_index <= BACNET_MAX_PRIORITY) {
if (Lighting_Output_Level[object_index][rpdata-> if (Lighting_Output_Level[object_index][rpdata->array_index
array_index - 1] == LIGHTING_LEVEL_NULL) - 1] == LIGHTING_LEVEL_NULL)
apdu_len = encode_application_null(&apdu[0]); apdu_len = encode_application_null(&apdu[0]);
else { else {
real_value = Lighting_Output_Level[object_index] real_value = Lighting_Output_Level[object_index]
@@ -551,11 +551,11 @@ bool Lighting_Output_Write_Property(
if (status) { if (status) {
level = LIGHTING_LEVEL_NULL; level = LIGHTING_LEVEL_NULL;
object_index = object_index =
Lighting_Output_Instance_To_Index(wp_data-> Lighting_Output_Instance_To_Index
object_instance); (wp_data->object_instance);
status = status =
Lighting_Output_Present_Value_Relinquish(wp_data-> Lighting_Output_Present_Value_Relinquish
object_instance, wp_data->priority); (wp_data->object_instance, wp_data->priority);
if (wp_data->priority == 6) { if (wp_data->priority == 6) {
/* Command priority 6 is reserved for use by Minimum On/Off /* Command priority 6 is reserved for use by Minimum On/Off
algorithm and may not be used for other purposes in any algorithm and may not be used for other purposes in any
@@ -582,8 +582,8 @@ bool Lighting_Output_Write_Property(
&wp_data->error_class, &wp_data->error_code); &wp_data->error_class, &wp_data->error_code);
if (status) { if (status) {
object_index = object_index =
Lighting_Output_Instance_To_Index(wp_data-> Lighting_Output_Instance_To_Index
object_instance); (wp_data->object_instance);
Lighting_Output_Out_Of_Service[object_index] = Lighting_Output_Out_Of_Service[object_index] =
value.type.Boolean; value.type.Boolean;
} }
+4 -4
View File
@@ -338,8 +338,8 @@ bool Life_Safety_Point_Write_Property(
if (status) { if (status) {
if (value.type.Enumerated <= MAX_LIFE_SAFETY_MODE) { if (value.type.Enumerated <= MAX_LIFE_SAFETY_MODE) {
object_index = object_index =
Life_Safety_Point_Instance_To_Index(wp_data-> Life_Safety_Point_Instance_To_Index
object_instance); (wp_data->object_instance);
Life_Safety_Point_Mode[object_index] = Life_Safety_Point_Mode[object_index] =
value.type.Enumerated; value.type.Enumerated;
} else { } else {
@@ -355,8 +355,8 @@ bool Life_Safety_Point_Write_Property(
&wp_data->error_class, &wp_data->error_code); &wp_data->error_class, &wp_data->error_code);
if (status) { if (status) {
object_index = object_index =
Life_Safety_Point_Instance_To_Index(wp_data-> Life_Safety_Point_Instance_To_Index
object_instance); (wp_data->object_instance);
Life_Safety_Point_Out_Of_Service[object_index] = Life_Safety_Point_Out_Of_Service[object_index] =
value.type.Boolean; value.type.Boolean;
} }
+51 -55
View File
@@ -262,9 +262,9 @@ bool Multistate_Input_Description_Set(
static bool Multistate_Input_Description_Write( static bool Multistate_Input_Description_Write(
uint32_t object_instance, uint32_t object_instance,
BACNET_CHARACTER_STRING *char_string, BACNET_CHARACTER_STRING * char_string,
BACNET_ERROR_CLASS *error_class, BACNET_ERROR_CLASS * error_class,
BACNET_ERROR_CODE *error_code) BACNET_ERROR_CODE * error_code)
{ {
unsigned index = 0; /* offset from instance lookup */ unsigned index = 0; /* offset from instance lookup */
size_t length = 0; size_t length = 0;
@@ -277,10 +277,9 @@ static bool Multistate_Input_Description_Write(
if (length <= sizeof(Object_Description[index])) { if (length <= sizeof(Object_Description[index])) {
encoding = characterstring_encoding(char_string); encoding = characterstring_encoding(char_string);
if (encoding == CHARACTER_UTF8) { if (encoding == CHARACTER_UTF8) {
status = characterstring_ansi_copy( status =
Object_Description[index], characterstring_ansi_copy(Object_Description[index],
sizeof(Object_Description[index]), sizeof(Object_Description[index]), char_string);
char_string);
if (!status) { if (!status) {
*error_class = ERROR_CLASS_PROPERTY; *error_class = ERROR_CLASS_PROPERTY;
*error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; *error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
@@ -346,9 +345,9 @@ bool Multistate_Input_Name_Set(
static bool Multistate_Input_Object_Name_Write( static bool Multistate_Input_Object_Name_Write(
uint32_t object_instance, uint32_t object_instance,
BACNET_CHARACTER_STRING *char_string, BACNET_CHARACTER_STRING * char_string,
BACNET_ERROR_CLASS *error_class, BACNET_ERROR_CLASS * error_class,
BACNET_ERROR_CODE *error_code) BACNET_ERROR_CODE * error_code)
{ {
unsigned index = 0; /* offset from instance lookup */ unsigned index = 0; /* offset from instance lookup */
size_t length = 0; size_t length = 0;
@@ -361,10 +360,9 @@ static bool Multistate_Input_Object_Name_Write(
if (length <= sizeof(Object_Name[index])) { if (length <= sizeof(Object_Name[index])) {
encoding = characterstring_encoding(char_string); encoding = characterstring_encoding(char_string);
if (encoding == CHARACTER_UTF8) { if (encoding == CHARACTER_UTF8) {
status = characterstring_ansi_copy( status =
Object_Name[index], characterstring_ansi_copy(Object_Name[index],
sizeof(Object_Name[index]), sizeof(Object_Name[index]), char_string);
char_string);
if (!status) { if (!status) {
*error_class = ERROR_CLASS_PROPERTY; *error_class = ERROR_CLASS_PROPERTY;
*error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; *error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
@@ -434,9 +432,9 @@ bool Multistate_Input_State_Text_Set(
static bool Multistate_Input_State_Text_Write( static bool Multistate_Input_State_Text_Write(
uint32_t object_instance, uint32_t object_instance,
uint32_t state_index, uint32_t state_index,
BACNET_CHARACTER_STRING *char_string, BACNET_CHARACTER_STRING * char_string,
BACNET_ERROR_CLASS *error_class, BACNET_ERROR_CLASS * error_class,
BACNET_ERROR_CODE *error_code) BACNET_ERROR_CODE * error_code)
{ {
unsigned index = 0; /* offset from instance lookup */ unsigned index = 0; /* offset from instance lookup */
size_t length = 0; size_t length = 0;
@@ -451,10 +449,9 @@ static bool Multistate_Input_State_Text_Write(
if (length <= sizeof(State_Text[index][state_index])) { if (length <= sizeof(State_Text[index][state_index])) {
encoding = characterstring_encoding(char_string); encoding = characterstring_encoding(char_string);
if (encoding == CHARACTER_UTF8) { if (encoding == CHARACTER_UTF8) {
status = characterstring_ansi_copy( status =
State_Text[index][state_index], characterstring_ansi_copy(State_Text[index][state_index],
sizeof(State_Text[index][state_index]), sizeof(State_Text[index][state_index]), char_string);
char_string);
if (!status) { if (!status) {
*error_class = ERROR_CLASS_PROPERTY; *error_class = ERROR_CLASS_PROPERTY;
*error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; *error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
@@ -562,7 +559,8 @@ int Multistate_Input_Read_Property(
} else if (rpdata->array_index == BACNET_ARRAY_ALL) { } else if (rpdata->array_index == BACNET_ARRAY_ALL) {
/* 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. */
max_states = Multistate_Input_Max_States(rpdata->object_instance); max_states =
Multistate_Input_Max_States(rpdata->object_instance);
for (i = 1; i <= max_states; i++) { for (i = 1; i <= max_states; i++) {
characterstring_init_ansi(&char_string, characterstring_init_ansi(&char_string,
Multistate_Input_State_Text(rpdata->object_instance, Multistate_Input_State_Text(rpdata->object_instance,
@@ -582,7 +580,8 @@ int Multistate_Input_Read_Property(
} }
} }
} else { } else {
max_states = Multistate_Input_Max_States(rpdata->object_instance); max_states =
Multistate_Input_Max_States(rpdata->object_instance);
if (rpdata->array_index <= max_states) { if (rpdata->array_index <= max_states) {
characterstring_init_ansi(&char_string, characterstring_init_ansi(&char_string,
Multistate_Input_State_Text(rpdata->object_instance, Multistate_Input_State_Text(rpdata->object_instance,
@@ -650,7 +649,7 @@ bool Multistate_Input_Write_Property(
if (value.tag == BACNET_APPLICATION_TAG_CHARACTER_STRING) { if (value.tag == BACNET_APPLICATION_TAG_CHARACTER_STRING) {
/* All the object names in a device must be unique */ /* All the object names in a device must be unique */
if (Device_Valid_Object_Name(&value.type.Character_String, if (Device_Valid_Object_Name(&value.type.Character_String,
&object_type, &object_instance)) { &object_type, &object_instance)) {
if ((object_type == wp_data->object_type) && if ((object_type == wp_data->object_type) &&
(object_instance == wp_data->object_instance)) { (object_instance == wp_data->object_instance)) {
/* writing same name to same object */ /* writing same name to same object */
@@ -661,11 +660,10 @@ bool Multistate_Input_Write_Property(
wp_data->error_code = ERROR_CODE_DUPLICATE_NAME; wp_data->error_code = ERROR_CODE_DUPLICATE_NAME;
} }
} else { } else {
status = Multistate_Input_Object_Name_Write( status =
wp_data->object_instance, Multistate_Input_Object_Name_Write(wp_data->
&value.type.Character_String, object_instance, &value.type.Character_String,
&wp_data->error_class, &wp_data->error_class, &wp_data->error_code);
&wp_data->error_code);
} }
} else { } else {
wp_data->error_class = ERROR_CLASS_PROPERTY; wp_data->error_class = ERROR_CLASS_PROPERTY;
@@ -674,11 +672,10 @@ bool Multistate_Input_Write_Property(
break; break;
case PROP_DESCRIPTION: case PROP_DESCRIPTION:
if (value.tag == BACNET_APPLICATION_TAG_CHARACTER_STRING) { if (value.tag == BACNET_APPLICATION_TAG_CHARACTER_STRING) {
status = Multistate_Input_Description_Write( status =
wp_data->object_instance, Multistate_Input_Description_Write(wp_data->
&value.type.Character_String, object_instance, &value.type.Character_String,
&wp_data->error_class, &wp_data->error_class, &wp_data->error_code);
&wp_data->error_code);
} else { } else {
wp_data->error_class = ERROR_CLASS_PROPERTY; wp_data->error_class = ERROR_CLASS_PROPERTY;
wp_data->error_code = ERROR_CODE_INVALID_DATA_TYPE; wp_data->error_code = ERROR_CODE_INVALID_DATA_TYPE;
@@ -690,8 +687,8 @@ bool Multistate_Input_Write_Property(
&wp_data->error_class, &wp_data->error_code); &wp_data->error_class, &wp_data->error_code);
if (status) { if (status) {
status = status =
Multistate_Input_Present_Value_Set(wp_data-> Multistate_Input_Present_Value_Set
object_instance, value.type.Unsigned_Int); (wp_data->object_instance, value.type.Unsigned_Int);
if (!status) { if (!status) {
wp_data->error_class = ERROR_CLASS_PROPERTY; wp_data->error_class = ERROR_CLASS_PROPERTY;
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
@@ -716,44 +713,43 @@ bool Multistate_Input_Write_Property(
wp_data->error_class = ERROR_CLASS_PROPERTY; wp_data->error_class = ERROR_CLASS_PROPERTY;
wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED; wp_data->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) {
max_states = Multistate_Input_Max_States( max_states =
wp_data->object_instance); Multistate_Input_Max_States(wp_data->object_instance);
array_index = 1; array_index = 1;
element_len = len; element_len = len;
do { do {
if (element_len) { if (element_len) {
status = Multistate_Input_State_Text_Write( status =
wp_data->object_instance, Multistate_Input_State_Text_Write(wp_data->
array_index, object_instance, array_index,
&value.type.Character_String, &value.type.Character_String,
&wp_data->error_class, &wp_data->error_class, &wp_data->error_code);
&wp_data->error_code);
} }
max_states--; max_states--;
array_index++; array_index++;
if (max_states) { if (max_states) {
element_len = bacapp_decode_application_data( element_len =
&wp_data->application_data[len], bacapp_decode_application_data(&wp_data->
wp_data->application_data_len-len, application_data[len],
&value); wp_data->application_data_len - len, &value);
if (element_len < 0) { if (element_len < 0) {
wp_data->error_class = ERROR_CLASS_PROPERTY; wp_data->error_class = ERROR_CLASS_PROPERTY;
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; wp_data->error_code =
ERROR_CODE_VALUE_OUT_OF_RANGE;
break; break;
} }
len += element_len; len += element_len;
} }
} while (max_states); } while (max_states);
} else { } else {
max_states = Multistate_Input_Max_States( max_states =
wp_data->object_instance); Multistate_Input_Max_States(wp_data->object_instance);
if (wp_data->array_index <= max_states) { if (wp_data->array_index <= max_states) {
status = Multistate_Input_State_Text_Write( status =
wp_data->object_instance, Multistate_Input_State_Text_Write(wp_data->
wp_data->array_index, object_instance, wp_data->array_index,
&value.type.Character_String, &value.type.Character_String,
&wp_data->error_class, &wp_data->error_class, &wp_data->error_code);
&wp_data->error_code);
} else { } else {
wp_data->error_class = ERROR_CLASS_PROPERTY; wp_data->error_class = ERROR_CLASS_PROPERTY;
wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED; wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
+10 -10
View File
@@ -268,8 +268,8 @@ int Multistate_Output_Read_Property(
/* into one packet. */ /* into one packet. */
else if (rpdata->array_index == BACNET_ARRAY_ALL) { else if (rpdata->array_index == BACNET_ARRAY_ALL) {
object_index = object_index =
Multistate_Output_Instance_To_Index(rpdata-> Multistate_Output_Instance_To_Index
object_instance); (rpdata->object_instance);
for (i = 0; i < BACNET_MAX_PRIORITY; i++) { for (i = 0; i < BACNET_MAX_PRIORITY; i++) {
/* FIXME: check if we have room before adding it to APDU */ /* FIXME: check if we have room before adding it to APDU */
if (Multistate_Output_Level[object_index][i] == if (Multistate_Output_Level[object_index][i] ==
@@ -294,8 +294,8 @@ int Multistate_Output_Read_Property(
} }
} else { } else {
object_index = object_index =
Multistate_Output_Instance_To_Index(rpdata-> Multistate_Output_Instance_To_Index
object_instance); (rpdata->object_instance);
if (rpdata->array_index <= BACNET_MAX_PRIORITY) { if (rpdata->array_index <= BACNET_MAX_PRIORITY) {
if (Multistate_Output_Level[object_index] if (Multistate_Output_Level[object_index]
[rpdata->array_index - 1] == MULTISTATE_NULL) [rpdata->array_index - 1] == MULTISTATE_NULL)
@@ -386,8 +386,8 @@ bool Multistate_Output_Write_Property(
(value.type.Unsigned_Int <= MULTISTATE_NUMBER_OF_STATES)) { (value.type.Unsigned_Int <= 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
object_instance); (wp_data->object_instance);
priority--; priority--;
Multistate_Output_Level[object_index][priority] = Multistate_Output_Level[object_index][priority] =
(uint8_t) level; (uint8_t) level;
@@ -414,8 +414,8 @@ bool Multistate_Output_Write_Property(
if (status) { if (status) {
level = MULTISTATE_NULL; level = MULTISTATE_NULL;
object_index = object_index =
Multistate_Output_Instance_To_Index(wp_data-> Multistate_Output_Instance_To_Index
object_instance); (wp_data->object_instance);
priority = wp_data->priority; priority = wp_data->priority;
if (priority && (priority <= BACNET_MAX_PRIORITY)) { if (priority && (priority <= BACNET_MAX_PRIORITY)) {
priority--; priority--;
@@ -441,8 +441,8 @@ bool Multistate_Output_Write_Property(
&wp_data->error_class, &wp_data->error_code); &wp_data->error_class, &wp_data->error_code);
if (status) { if (status) {
object_index = object_index =
Multistate_Output_Instance_To_Index(wp_data-> Multistate_Output_Instance_To_Index
object_instance); (wp_data->object_instance);
Multistate_Output_Out_Of_Service[object_index] = Multistate_Output_Out_Of_Service[object_index] =
value.type.Boolean; value.type.Boolean;
} }
+6 -6
View File
@@ -438,8 +438,8 @@ int Multistate_Value_Read_Property(
/* 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. */
object_index = object_index =
Multistate_Value_Instance_To_Index(rpdata-> Multistate_Value_Instance_To_Index
object_instance); (rpdata->object_instance);
for (i = 1; i <= MULTISTATE_NUMBER_OF_STATES; i++) { for (i = 1; i <= MULTISTATE_NUMBER_OF_STATES; i++) {
characterstring_init_ansi(&char_string, characterstring_init_ansi(&char_string,
Multistate_Value_State_Text(rpdata->object_instance, Multistate_Value_State_Text(rpdata->object_instance,
@@ -460,8 +460,8 @@ int Multistate_Value_Read_Property(
} }
} else { } else {
object_index = object_index =
Multistate_Value_Instance_To_Index(rpdata-> Multistate_Value_Instance_To_Index
object_instance); (rpdata->object_instance);
if (rpdata->array_index <= MULTISTATE_NUMBER_OF_STATES) { if (rpdata->array_index <= MULTISTATE_NUMBER_OF_STATES) {
characterstring_init_ansi(&char_string, characterstring_init_ansi(&char_string,
Multistate_Value_State_Text(rpdata->object_instance, Multistate_Value_State_Text(rpdata->object_instance,
@@ -528,8 +528,8 @@ bool Multistate_Value_Write_Property(
&wp_data->error_class, &wp_data->error_code); &wp_data->error_class, &wp_data->error_code);
if (status) { if (status) {
status = status =
Multistate_Value_Present_Value_Set(wp_data-> Multistate_Value_Present_Value_Set
object_instance, value.type.Unsigned_Int); (wp_data->object_instance, value.type.Unsigned_Int);
if (!status) { if (!status) {
wp_data->error_class = ERROR_CLASS_PROPERTY; wp_data->error_class = ERROR_CLASS_PROPERTY;
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
+57 -50
View File
@@ -189,8 +189,8 @@ int Notification_Class_Read_Property(
apdu = rpdata->application_data; apdu = rpdata->application_data;
CurrentNotify = CurrentNotify =
&NC_Info[Notification_Class_Instance_To_Index &NC_Info[Notification_Class_Instance_To_Index(rpdata->
(rpdata->object_instance)]; object_instance)];
switch (rpdata->object_property) { switch (rpdata->object_property) {
case PROP_OBJECT_IDENTIFIER: case PROP_OBJECT_IDENTIFIER:
@@ -400,8 +400,8 @@ bool Notification_Class_Write_Property(
CurrentNotify = CurrentNotify =
&NC_Info[Notification_Class_Instance_To_Index &NC_Info[Notification_Class_Instance_To_Index(wp_data->
(wp_data->object_instance)]; object_instance)];
/* decode the some of the request /* decode the some of the request
*/ */
@@ -467,8 +467,9 @@ bool Notification_Class_Write_Property(
while (iOffset < wp_data->application_data_len) { while (iOffset < wp_data->application_data_len) {
/* Decode Valid Days */ /* Decode Valid Days */
len = len =
bacapp_decode_application_data(&wp_data->application_data bacapp_decode_application_data(&wp_data->
[iOffset], wp_data->application_data_len, &value); application_data[iOffset], wp_data->application_data_len,
&value);
if ((len == 0) || if ((len == 0) ||
(value.tag != BACNET_APPLICATION_TAG_BIT_STRING)) { (value.tag != BACNET_APPLICATION_TAG_BIT_STRING)) {
@@ -491,8 +492,9 @@ bool Notification_Class_Write_Property(
iOffset += len; iOffset += len;
/* Decode From Time */ /* Decode From Time */
len = len =
bacapp_decode_application_data(&wp_data->application_data bacapp_decode_application_data(&wp_data->
[iOffset], wp_data->application_data_len, &value); application_data[iOffset], wp_data->application_data_len,
&value);
if ((len == 0) || (value.tag != BACNET_APPLICATION_TAG_TIME)) { if ((len == 0) || (value.tag != BACNET_APPLICATION_TAG_TIME)) {
/* Bad decode, wrong tag or following required parameter missing */ /* Bad decode, wrong tag or following required parameter missing */
@@ -506,8 +508,9 @@ bool Notification_Class_Write_Property(
iOffset += len; iOffset += len;
/* Decode To Time */ /* Decode To Time */
len = len =
bacapp_decode_application_data(&wp_data->application_data bacapp_decode_application_data(&wp_data->
[iOffset], wp_data->application_data_len, &value); application_data[iOffset], wp_data->application_data_len,
&value);
if ((len == 0) || (value.tag != BACNET_APPLICATION_TAG_TIME)) { if ((len == 0) || (value.tag != BACNET_APPLICATION_TAG_TIME)) {
/* Bad decode, wrong tag or following required parameter missing */ /* Bad decode, wrong tag or following required parameter missing */
@@ -526,8 +529,9 @@ bool Notification_Class_Write_Property(
RECIPIENT_TYPE_DEVICE; RECIPIENT_TYPE_DEVICE;
/* Decode Network Number */ /* Decode Network Number */
len = len =
bacapp_decode_context_data(&wp_data->application_data bacapp_decode_context_data(&wp_data->
[iOffset], wp_data->application_data_len, &value, application_data[iOffset],
wp_data->application_data_len, &value,
PROP_RECIPIENT_LIST); PROP_RECIPIENT_LIST);
if ((len == 0) || if ((len == 0) ||
@@ -538,21 +542,21 @@ bool Notification_Class_Write_Property(
return false; return false;
} }
/* store value */ /* store value */
TmpNotify.Recipient_List[idx].Recipient. TmpNotify.Recipient_List[idx].Recipient._.
_.DeviceIdentifier = value.type.Object_Id.instance; DeviceIdentifier = value.type.Object_Id.instance;
iOffset += len; iOffset += len;
} }
/* opening tag [1] - Recipient */ /* opening tag [1] - Recipient */
else if (decode_is_opening_tag_number else if (decode_is_opening_tag_number(&wp_data->
(&wp_data->application_data[iOffset], 1)) { application_data[iOffset], 1)) {
iOffset++; iOffset++;
TmpNotify.Recipient_List[idx].Recipient.RecipientType = TmpNotify.Recipient_List[idx].Recipient.RecipientType =
RECIPIENT_TYPE_ADDRESS; RECIPIENT_TYPE_ADDRESS;
/* Decode Network Number */ /* Decode Network Number */
len = len =
bacapp_decode_application_data bacapp_decode_application_data(&wp_data->
(&wp_data->application_data[iOffset], application_data[iOffset],
wp_data->application_data_len, &value); wp_data->application_data_len, &value);
if ((len == 0) || if ((len == 0) ||
@@ -569,8 +573,8 @@ bool Notification_Class_Write_Property(
iOffset += len; iOffset += len;
/* Decode Address */ /* Decode Address */
len = len =
bacapp_decode_application_data bacapp_decode_application_data(&wp_data->
(&wp_data->application_data[iOffset], application_data[iOffset],
wp_data->application_data_len, &value); wp_data->application_data_len, &value);
if ((len == 0) || if ((len == 0) ||
@@ -581,16 +585,16 @@ bool Notification_Class_Write_Property(
return false; return false;
} }
/* store value */ /* store value */
if (TmpNotify.Recipient_List[idx].Recipient._. if (TmpNotify.Recipient_List[idx].Recipient._.Address.
Address.net == 0) { net == 0) {
memcpy(TmpNotify.Recipient_List[idx].Recipient. memcpy(TmpNotify.Recipient_List[idx].Recipient._.
_.Address.mac, value.type.Octet_String.value, Address.mac, value.type.Octet_String.value,
value.type.Octet_String.length); value.type.Octet_String.length);
TmpNotify.Recipient_List[idx].Recipient._. TmpNotify.Recipient_List[idx].Recipient._.Address.
Address.mac_len = value.type.Octet_String.length; mac_len = value.type.Octet_String.length;
} else { } else {
memcpy(TmpNotify.Recipient_List[idx].Recipient. memcpy(TmpNotify.Recipient_List[idx].Recipient._.
_.Address.adr, value.type.Octet_String.value, Address.adr, value.type.Octet_String.value,
value.type.Octet_String.length); value.type.Octet_String.length);
TmpNotify.Recipient_List[idx].Recipient._.Address.len = TmpNotify.Recipient_List[idx].Recipient._.Address.len =
value.type.Octet_String.length; value.type.Octet_String.length;
@@ -598,8 +602,8 @@ bool Notification_Class_Write_Property(
iOffset += len; iOffset += len;
/* closing tag [1] - Recipient */ /* closing tag [1] - Recipient */
if (decode_is_closing_tag_number(&wp_data->application_data if (decode_is_closing_tag_number(&wp_data->
[iOffset], 1)) application_data[iOffset], 1))
iOffset++; iOffset++;
else { else {
/* Bad decode, wrong tag or following required parameter missing */ /* Bad decode, wrong tag or following required parameter missing */
@@ -616,8 +620,9 @@ bool Notification_Class_Write_Property(
/* Process Identifier */ /* Process Identifier */
len = len =
bacapp_decode_application_data(&wp_data->application_data bacapp_decode_application_data(&wp_data->
[iOffset], wp_data->application_data_len, &value); application_data[iOffset], wp_data->application_data_len,
&value);
if ((len == 0) || if ((len == 0) ||
(value.tag != BACNET_APPLICATION_TAG_UNSIGNED_INT)) { (value.tag != BACNET_APPLICATION_TAG_UNSIGNED_INT)) {
@@ -633,8 +638,9 @@ bool Notification_Class_Write_Property(
iOffset += len; iOffset += len;
/* Issue Confirmed Notifications */ /* Issue Confirmed Notifications */
len = len =
bacapp_decode_application_data(&wp_data->application_data bacapp_decode_application_data(&wp_data->
[iOffset], wp_data->application_data_len, &value); application_data[iOffset], wp_data->application_data_len,
&value);
if ((len == 0) || if ((len == 0) ||
(value.tag != BACNET_APPLICATION_TAG_BOOLEAN)) { (value.tag != BACNET_APPLICATION_TAG_BOOLEAN)) {
@@ -650,8 +656,9 @@ bool Notification_Class_Write_Property(
iOffset += len; iOffset += len;
/* Transitions */ /* Transitions */
len = len =
bacapp_decode_application_data(&wp_data->application_data bacapp_decode_application_data(&wp_data->
[iOffset], wp_data->application_data_len, &value); application_data[iOffset], wp_data->application_data_len,
&value);
if ((len == 0) || if ((len == 0) ||
(value.tag != BACNET_APPLICATION_TAG_BIT_STRING)) { (value.tag != BACNET_APPLICATION_TAG_BIT_STRING)) {
@@ -692,16 +699,16 @@ bool Notification_Class_Write_Property(
CurrentNotify->Recipient_List[idx] = CurrentNotify->Recipient_List[idx] =
TmpNotify.Recipient_List[idx]; TmpNotify.Recipient_List[idx];
if (CurrentNotify->Recipient_List[idx]. if (CurrentNotify->Recipient_List[idx].Recipient.
Recipient.RecipientType == RECIPIENT_TYPE_DEVICE) { RecipientType == RECIPIENT_TYPE_DEVICE) {
/* copy Device_ID */ /* copy Device_ID */
DeviceID = DeviceID =
CurrentNotify->Recipient_List[idx].Recipient. CurrentNotify->Recipient_List[idx].Recipient._.
_.DeviceIdentifier; DeviceIdentifier;
address_bind_request(DeviceID, &max_apdu, &src); address_bind_request(DeviceID, &max_apdu, &src);
} else if (CurrentNotify->Recipient_List[idx]. } else if (CurrentNotify->Recipient_List[idx].Recipient.
Recipient.RecipientType == RECIPIENT_TYPE_ADDRESS) { RecipientType == RECIPIENT_TYPE_ADDRESS) {
/* copy Address */ /* copy Address */
/* src = CurrentNotify->Recipient_List[idx].Recipient._.Address; */ /* src = CurrentNotify->Recipient_List[idx].Recipient._.Address; */
/* address_bind_request(BACNET_MAX_INSTANCE, &max_apdu, &src); */ /* address_bind_request(BACNET_MAX_INSTANCE, &max_apdu, &src); */
@@ -824,16 +831,16 @@ void Notification_Class_common_reporting_function(
event_data->priority = event_data->priority =
CurrentNotify->Priority[TRANSITION_TO_NORMAL]; CurrentNotify->Priority[TRANSITION_TO_NORMAL];
event_data->ackRequired = event_data->ackRequired =
(CurrentNotify->Ack_Required & TRANSITION_TO_NORMAL_MASKED) ? (CurrentNotify->
true : false; Ack_Required & TRANSITION_TO_NORMAL_MASKED) ? true : false;
break; break;
case EVENT_STATE_FAULT: case EVENT_STATE_FAULT:
event_data->priority = event_data->priority =
CurrentNotify->Priority[TRANSITION_TO_FAULT]; CurrentNotify->Priority[TRANSITION_TO_FAULT];
event_data->ackRequired = event_data->ackRequired =
(CurrentNotify->Ack_Required & TRANSITION_TO_FAULT_MASKED) ? (CurrentNotify->
true : false; Ack_Required & TRANSITION_TO_FAULT_MASKED) ? true : false;
break; break;
case EVENT_STATE_OFFNORMAL: case EVENT_STATE_OFFNORMAL:
@@ -918,13 +925,13 @@ void Notification_Class_find_recipient(
RECIPIENT_TYPE_DEVICE) { RECIPIENT_TYPE_DEVICE) {
/* Device ID */ /* Device ID */
DeviceID = DeviceID =
CurrentNotify->Recipient_List[idx].Recipient. CurrentNotify->Recipient_List[idx].Recipient._.
_.DeviceIdentifier; DeviceIdentifier;
/* Send who_ is request only when address of device is unknown. */ /* Send who_ is request only when address of device is unknown. */
if (!address_bind_request(DeviceID, &max_apdu, &src)) if (!address_bind_request(DeviceID, &max_apdu, &src))
Send_WhoIs(DeviceID, DeviceID); Send_WhoIs(DeviceID, DeviceID);
} else if (CurrentNotify->Recipient_List[idx]. } else if (CurrentNotify->Recipient_List[idx].Recipient.
Recipient.RecipientType == RECIPIENT_TYPE_ADDRESS) { RecipientType == RECIPIENT_TYPE_ADDRESS) {
} }
} }
+7 -7
View File
@@ -743,9 +743,9 @@ bool Trend_Log_Write_Property(
if (wp_data->application_data_len != 0) { if (wp_data->application_data_len != 0) {
iOffset += len; iOffset += len;
len = len =
bacapp_decode_context_data(&wp_data-> bacapp_decode_context_data(&wp_data->application_data
application_data[iOffset], wp_data->application_data_len, [iOffset], wp_data->application_data_len, &value,
&value, PROP_LOG_DEVICE_OBJECT_PROPERTY); PROP_LOG_DEVICE_OBJECT_PROPERTY);
if ((len == 0) || ((value.context_tag != 2) && if ((len == 0) || ((value.context_tag != 2) &&
(value.context_tag != 3))) { (value.context_tag != 3))) {
/* Bad decode or wrong tag */ /* Bad decode or wrong tag */
@@ -762,8 +762,8 @@ bool Trend_Log_Write_Property(
if (wp_data->application_data_len != 0) { if (wp_data->application_data_len != 0) {
iOffset += len; iOffset += len;
len = len =
bacapp_decode_context_data(&wp_data-> bacapp_decode_context_data
application_data[iOffset], (&wp_data->application_data[iOffset],
wp_data->application_data_len, &value, wp_data->application_data_len, &value,
PROP_LOG_DEVICE_OBJECT_PROPERTY); PROP_LOG_DEVICE_OBJECT_PROPERTY);
if ((len == 0) || (value.context_tag != 3)) { if ((len == 0) || (value.context_tag != 3)) {
@@ -1105,8 +1105,8 @@ int rr_trend_log_encode(
pRequest->ItemCount = 0; /* Start out with nothing */ pRequest->ItemCount = 0; /* Start out with nothing */
/* Bail out now if nowt - should never happen for a Trend Log but ... */ /* Bail out now if nowt - should never happen for a Trend Log but ... */
if (LogInfo[Trend_Log_Instance_To_Index(pRequest->object_instance)]. if (LogInfo[Trend_Log_Instance_To_Index(pRequest->
ulRecordCount == 0) object_instance)].ulRecordCount == 0)
return (0); return (0);
if ((pRequest->RequestType == RR_BY_POSITION) || if ((pRequest->RequestType == RR_BY_POSITION) ||
+4 -4
View File
@@ -223,10 +223,10 @@ void rpm_ack_extract_data(
} else { } else {
/* AccessError */ /* AccessError */
sprintf(ackString, "BACnet Error: %s: %s", sprintf(ackString, "BACnet Error: %s: %s",
bactext_error_class_name((int) listOfProperties->error. bactext_error_class_name((int) listOfProperties->
error_class), error.error_class),
bactext_error_code_name((int) listOfProperties->error. bactext_error_code_name((int) listOfProperties->
error_code)); error.error_code));
LogError(ackString); LogError(ackString);
} }
listOfProperties = listOfProperties->next; listOfProperties = listOfProperties->next;
+6 -9
View File
@@ -126,16 +126,14 @@ int main(
return 0; return 0;
} }
if ((argc > 1) && (strcmp(argv[1], "--help") == 0)) { if ((argc > 1) && (strcmp(argv[1], "--help") == 0)) {
printf("Send a Read-Broadcast-Distribution-Table message to a BBMD.\r\n" printf
"\r\n" ("Send a Read-Broadcast-Distribution-Table message to a BBMD.\r\n"
"IP:\r\n" "\r\n" "IP:\r\n"
"IP address of the BBMD in dotted decimal notation\r\n" "IP address of the BBMD in dotted decimal notation\r\n"
"[port]\r\n" "[port]\r\n"
"optional BACnet/IP port number (default=47808=0xBAC0)\r\n" "optional BACnet/IP port number (default=47808=0xBAC0)\r\n" "\r\n"
"\r\n"
"To send a Read-Broadcast-Distribution-Table message to a BBMD\r\n" "To send a Read-Broadcast-Distribution-Table message to a BBMD\r\n"
"at 192.168.0.1 using port 47808:\r\n" "at 192.168.0.1 using port 47808:\r\n" "%s 192.168.0.1 47808\r\n",
"%s 192.168.0.1 47808\r\n",
filename_remove_path(argv[0])); filename_remove_path(argv[0]));
return 0; return 0;
} }
@@ -143,8 +141,7 @@ int main(
if (argc > 1) { if (argc > 1) {
Target_BBMD_Address = inet_addr(argv[1]); Target_BBMD_Address = inet_addr(argv[1]);
if (Target_BBMD_Address == (-1)) { if (Target_BBMD_Address == (-1)) {
fprintf(stderr, "IP=%s - failed to convert address.\r\n", fprintf(stderr, "IP=%s - failed to convert address.\r\n", argv[1]);
argv[1]);
return 1; return 1;
} }
} }
+2 -1
View File
@@ -258,7 +258,8 @@ int main(
/* at least one second has passed */ /* at least one second has passed */
if (current_seconds != last_seconds) if (current_seconds != last_seconds)
tsm_timer_milliseconds((uint16_t)((current_seconds - last_seconds) * 1000)); tsm_timer_milliseconds((uint16_t) ((current_seconds -
last_seconds) * 1000));
if (Error_Detected) if (Error_Detected)
break; break;
/* wait until the device is bound, or timeout and quit */ /* wait until the device is bound, or timeout and quit */
+338 -311
View File
@@ -21,9 +21,10 @@ Copyright (C) 2012 Andriy Sukhynyuk, Vasyl Tkhir, Andriy Ivasiv
#include "bacint.h" #include "bacint.h"
#ifdef TEST_PACKET #ifdef TEST_PACKET
uint8_t test_packet[]={0x81, 0x0a, 0x00, 0x16, /* BVLC header */ uint8_t test_packet[] = { 0x81, 0x0a, 0x00, 0x16, /* BVLC header */
0x01, 0x24, 0x00, 0x01, 0x01, 0x0b, 0xff, /* NPDU */ 0x01, 0x24, 0x00, 0x01, 0x01, 0x0b, 0xff, /* NPDU */
0x00, 0x03, 0x01, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x02, 0x19, 0x55}; /* APDU */ 0x00, 0x03, 0x01, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x02, 0x19, 0x55
}; /* APDU */
#endif #endif
extern int get_local_address_ioctl( extern int get_local_address_ioctl(
@@ -31,345 +32,371 @@ extern int get_local_address_ioctl(
struct in_addr *addr, struct in_addr *addr,
int request); int request);
void* dl_ip_thread(void *pArgs) { void *dl_ip_thread(
MSGBOX_ID msgboxid; void *pArgs)
BACMSG msg_storage, *bacmsg = NULL;
MSG_DATA *msg_data;
ROUTER_PORT *port = (ROUTER_PORT*)pArgs;
IP_DATA ip_data; /* port specific parameters */
BACNET_ADDRESS address = { 0 };
int status;
uint8_t shutdown = 0;
/* initialize router port */
if (!dl_ip_init(port, &ip_data)) {
port->state = INIT_FAILED;
return NULL;
}
/* allocate buffer */
ip_data.max_buff = MAX_BIP_MPDU;
ip_data.buff = (uint8_t*)malloc(ip_data.max_buff);
if (ip_data.buff == NULL) {
port->state = INIT_FAILED;
return NULL;
}
msgboxid = create_msgbox();
if (msgboxid == INVALID_MSGBOX_ID) {
PRINT(ERROR, "Error: Failed to create message box");
port->state = INIT_FAILED;
return NULL;
}
port->port_id = msgboxid;
port->state = RUNNING;
while (!shutdown) {
/* check for incoming messages */
bacmsg = recv_from_msgbox(port->port_id, &msg_storage);
if (bacmsg) {
switch(bacmsg->type) {
case DATA: {
msg_data = (MSG_DATA*)bacmsg->data;
memmove(&address.net, &msg_data->dest.net, 2);
memmove(&address.mac_len, &msg_data->dest.len, 1);
memmove(&address.mac[0], &msg_data->dest.adr[0], MAX_MAC_LEN);
dl_ip_send(&ip_data, &address, msg_data->pdu, msg_data->pdu_len);
check_data(msg_data);
break;
}
case SERVICE: {
switch(bacmsg->subtype) {
case SHUTDOWN:
del_msgbox(port->port_id);
shutdown = 1;
break;
default:
break;
}
break;
}
default:
break;
}
} else {
status = dl_ip_recv(&ip_data, &msg_data, &address, 1000);
if (status > 0) {
memmove(&msg_data->src.len, &address.mac_len, 1);
memmove(&msg_data->src.adr[0], &address.mac[0], MAX_MAC_LEN);
msg_storage.origin = port->port_id;
msg_storage.type = DATA;
msg_storage.data = msg_data;
if (!send_to_msgbox(port->main_id, &msg_storage)) {
free_data(msg_data);
}
}
}
}
/* cleanup procedure */
dl_ip_cleanup(&ip_data);
port->state = FINISHED;
return NULL;
}
bool dl_ip_init(ROUTER_PORT *port,
IP_DATA *ip_data) {
struct sockaddr_in sin;
int socket_opt = 0;
int status = 0; /* for error checking */
/* setup port for later use */
ip_data->port = htons(port->params.bip_params.port);
/* get local address */
status = get_local_address_ioctl(port->iface, &ip_data->local_addr, SIOCGIFADDR);
if (status < 0) {
return false;
}
/* get broadcast address */
status = get_local_address_ioctl(port->iface, &ip_data->broadcast_addr, SIOCGIFBRDADDR);
if (status < 0) {
return false;
}
ip_data->socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (ip_data->socket < 0)
return false;
/* setup socket options */
socket_opt = 1;
status = setsockopt(ip_data->socket, SOL_SOCKET, SO_REUSEADDR, &socket_opt, sizeof(socket_opt));
if (status < 0) {
close(ip_data->socket);
return false;
}
status = setsockopt(ip_data->socket, SOL_SOCKET, SO_BROADCAST, &socket_opt, sizeof(socket_opt));
if (status < 0) {
close(ip_data->socket);
return false;
}
/* bind the socket to the local port number */
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(INADDR_ANY);
sin.sin_port = ip_data->port;
memset(&sin.sin_zero, '\0', sizeof(sin.sin_zero));
status = bind(ip_data->socket, (const struct sockaddr *) &sin, sizeof(struct sockaddr));
if (status < 0) {
close(ip_data->socket);
return false;
}
/* add BIP address to router port structure */
memcpy(&port->route_info.mac[0], &ip_data->local_addr.s_addr, 4);
memcpy(&port->route_info.mac[4], &port->params.bip_params.port, 2);
port->route_info.mac_len = 6;
PRINT(INFO, "Interface: %s\n", port->iface);
PRINT(INFO, "IP Address: %s\n", inet_ntoa(ip_data->local_addr));
PRINT(INFO, "IP Broadcast Address: %s\n", inet_ntoa(ip_data->broadcast_addr));
PRINT(INFO, "UDP Port: 0x%04X [%hu]\n", (port->params.bip_params.port),
(port->params.bip_params.port));
return true;
}
int dl_ip_send(IP_DATA *data,
BACNET_ADDRESS *dest,
uint8_t *pdu,
unsigned pdu_len)
{ {
struct sockaddr_in bip_dest = { 0 }; MSGBOX_ID msgboxid;
int buff_len = 0; BACMSG msg_storage, *bacmsg = NULL;
int bytes_sent = 0; MSG_DATA *msg_data;
ROUTER_PORT *port = (ROUTER_PORT *) pArgs;
IP_DATA ip_data; /* port specific parameters */
BACNET_ADDRESS address = { 0 };
int status;
uint8_t shutdown = 0;
if (data->socket < 0) /* initialize router port */
return -1; if (!dl_ip_init(port, &ip_data)) {
port->state = INIT_FAILED;
return NULL;
}
data->buff[0] = BVLL_TYPE_BACNET_IP; /* allocate buffer */
bip_dest.sin_family = AF_INET; ip_data.max_buff = MAX_BIP_MPDU;
if (dest->net == BACNET_BROADCAST_NETWORK) { ip_data.buff = (uint8_t *) malloc(ip_data.max_buff);
/* broadcast */
bip_dest.sin_addr.s_addr = data->broadcast_addr.s_addr;
bip_dest.sin_port = data->port;
data->buff[1] = BVLC_ORIGINAL_BROADCAST_NPDU;
} else if (dest->mac_len == 6) {
memcpy(&bip_dest.sin_addr.s_addr, &dest->mac[0], 4);
memcpy(&bip_dest.sin_port, &dest->mac[4], 2);
data->buff[1] = BVLC_ORIGINAL_UNICAST_NPDU;
} else {
/* invalid address */
return -1;
}
buff_len = 2; if (ip_data.buff == NULL) {
buff_len += port->state = INIT_FAILED;
encode_unsigned16(&data->buff[buff_len], return NULL;
(uint16_t) (pdu_len + 4 /*inclusive*/ )); }
memcpy(&data->buff[buff_len], pdu, pdu_len);
buff_len += pdu_len;
/* send the packet */ msgboxid = create_msgbox();
bytes_sent = if (msgboxid == INVALID_MSGBOX_ID) {
sendto(data->socket, (char *) data->buff, buff_len, 0, PRINT(ERROR, "Error: Failed to create message box");
(struct sockaddr *) &bip_dest, sizeof(struct sockaddr)); port->state = INIT_FAILED;
return NULL;
}
PRINT(DEBUG, "send to %s\n", inet_ntoa(bip_dest.sin_addr)); port->port_id = msgboxid;
port->state = RUNNING;
return bytes_sent; while (!shutdown) {
/* check for incoming messages */
bacmsg = recv_from_msgbox(port->port_id, &msg_storage);
if (bacmsg) {
switch (bacmsg->type) {
case DATA:{
msg_data = (MSG_DATA *) bacmsg->data;
memmove(&address.net, &msg_data->dest.net, 2);
memmove(&address.mac_len, &msg_data->dest.len, 1);
memmove(&address.mac[0], &msg_data->dest.adr[0],
MAX_MAC_LEN);
dl_ip_send(&ip_data, &address, msg_data->pdu,
msg_data->pdu_len);
check_data(msg_data);
break;
}
case SERVICE:{
switch (bacmsg->subtype) {
case SHUTDOWN:
del_msgbox(port->port_id);
shutdown = 1;
break;
default:
break;
}
break;
}
default:
break;
}
} else {
status = dl_ip_recv(&ip_data, &msg_data, &address, 1000);
if (status > 0) {
memmove(&msg_data->src.len, &address.mac_len, 1);
memmove(&msg_data->src.adr[0], &address.mac[0], MAX_MAC_LEN);
msg_storage.origin = port->port_id;
msg_storage.type = DATA;
msg_storage.data = msg_data;
if (!send_to_msgbox(port->main_id, &msg_storage)) {
free_data(msg_data);
}
}
}
}
/* cleanup procedure */
dl_ip_cleanup(&ip_data);
port->state = FINISHED;
return NULL;
}
bool dl_ip_init(
ROUTER_PORT * port,
IP_DATA * ip_data)
{
struct sockaddr_in sin;
int socket_opt = 0;
int status = 0; /* for error checking */
/* setup port for later use */
ip_data->port = htons(port->params.bip_params.port);
/* get local address */
status =
get_local_address_ioctl(port->iface, &ip_data->local_addr,
SIOCGIFADDR);
if (status < 0) {
return false;
}
/* get broadcast address */
status =
get_local_address_ioctl(port->iface, &ip_data->broadcast_addr,
SIOCGIFBRDADDR);
if (status < 0) {
return false;
}
ip_data->socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (ip_data->socket < 0)
return false;
/* setup socket options */
socket_opt = 1;
status =
setsockopt(ip_data->socket, SOL_SOCKET, SO_REUSEADDR, &socket_opt,
sizeof(socket_opt));
if (status < 0) {
close(ip_data->socket);
return false;
}
status =
setsockopt(ip_data->socket, SOL_SOCKET, SO_BROADCAST, &socket_opt,
sizeof(socket_opt));
if (status < 0) {
close(ip_data->socket);
return false;
}
/* bind the socket to the local port number */
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(INADDR_ANY);
sin.sin_port = ip_data->port;
memset(&sin.sin_zero, '\0', sizeof(sin.sin_zero));
status =
bind(ip_data->socket, (const struct sockaddr *) &sin,
sizeof(struct sockaddr));
if (status < 0) {
close(ip_data->socket);
return false;
}
/* add BIP address to router port structure */
memcpy(&port->route_info.mac[0], &ip_data->local_addr.s_addr, 4);
memcpy(&port->route_info.mac[4], &port->params.bip_params.port, 2);
port->route_info.mac_len = 6;
PRINT(INFO, "Interface: %s\n", port->iface);
PRINT(INFO, "IP Address: %s\n", inet_ntoa(ip_data->local_addr));
PRINT(INFO, "IP Broadcast Address: %s\n",
inet_ntoa(ip_data->broadcast_addr));
PRINT(INFO, "UDP Port: 0x%04X [%hu]\n", (port->params.bip_params.port),
(port->params.bip_params.port));
return true;
}
int dl_ip_send(
IP_DATA * data,
BACNET_ADDRESS * dest,
uint8_t * pdu,
unsigned pdu_len)
{
struct sockaddr_in bip_dest = { 0 };
int buff_len = 0;
int bytes_sent = 0;
if (data->socket < 0)
return -1;
data->buff[0] = BVLL_TYPE_BACNET_IP;
bip_dest.sin_family = AF_INET;
if (dest->net == BACNET_BROADCAST_NETWORK) {
/* broadcast */
bip_dest.sin_addr.s_addr = data->broadcast_addr.s_addr;
bip_dest.sin_port = data->port;
data->buff[1] = BVLC_ORIGINAL_BROADCAST_NPDU;
} else if (dest->mac_len == 6) {
memcpy(&bip_dest.sin_addr.s_addr, &dest->mac[0], 4);
memcpy(&bip_dest.sin_port, &dest->mac[4], 2);
data->buff[1] = BVLC_ORIGINAL_UNICAST_NPDU;
} else {
/* invalid address */
return -1;
}
buff_len = 2;
buff_len +=
encode_unsigned16(&data->buff[buff_len],
(uint16_t) (pdu_len + 4 /*inclusive */ ));
memcpy(&data->buff[buff_len], pdu, pdu_len);
buff_len += pdu_len;
/* send the packet */
bytes_sent =
sendto(data->socket, (char *) data->buff, buff_len, 0,
(struct sockaddr *) &bip_dest, sizeof(struct sockaddr));
PRINT(DEBUG, "send to %s\n", inet_ntoa(bip_dest.sin_addr));
return bytes_sent;
} }
int dl_ip_recv( int dl_ip_recv(
IP_DATA *data, IP_DATA * data,
MSG_DATA **msg_data, MSG_DATA ** msg_data,
BACNET_ADDRESS *src, BACNET_ADDRESS * src,
unsigned timeout) unsigned timeout)
{ {
int received_bytes = 0; int received_bytes = 0;
uint16_t buff_len = 0; /* return value */ uint16_t buff_len = 0; /* return value */
fd_set read_fds; fd_set read_fds;
struct timeval select_timeout; struct timeval select_timeout;
struct sockaddr_in sin = { 0 }; struct sockaddr_in sin = { 0 };
socklen_t sin_len = sizeof(sin); socklen_t sin_len = sizeof(sin);
/* make sure the socket is open */ /* make sure the socket is open */
if (data->socket < 0) if (data->socket < 0)
return 0; return 0;
if (timeout >= 1000) { if (timeout >= 1000) {
select_timeout.tv_sec = timeout / 1000; select_timeout.tv_sec = timeout / 1000;
select_timeout.tv_usec = 1000 * (timeout - select_timeout.tv_sec * 1000); select_timeout.tv_usec =
} else { 1000 * (timeout - select_timeout.tv_sec * 1000);
select_timeout.tv_sec = 0; } else {
select_timeout.tv_usec = 1000 * timeout; select_timeout.tv_sec = 0;
} select_timeout.tv_usec = 1000 * timeout;
}
FD_ZERO(&read_fds); FD_ZERO(&read_fds);
FD_SET(data->socket, &read_fds); FD_SET(data->socket, &read_fds);
#ifdef TEST_PACKET #ifdef TEST_PACKET
received_bytes = sizeof(test_packet); received_bytes = sizeof(test_packet);
memmove(data->buff, &test_packet, received_bytes); memmove(data->buff, &test_packet, received_bytes);
sin.sin_addr.s_addr = 0x7E1D40A; sin.sin_port = 0xC0BA; sin.sin_addr.s_addr = 0x7E1D40A;
sin.sin_port = 0xC0BA;
#else #else
int ret = select(data->socket + 1, &read_fds, NULL, NULL, &select_timeout); int ret = select(data->socket + 1, &read_fds, NULL, NULL, &select_timeout);
/* see if there is a packet for us */ /* see if there is a packet for us */
if (ret > 0) if (ret > 0)
received_bytes = received_bytes =
recvfrom(data->socket, (char *) &data->buff[0], data->max_buff, 0, recvfrom(data->socket, (char *) &data->buff[0], data->max_buff, 0,
(struct sockaddr *) &sin, &sin_len); (struct sockaddr *) &sin, &sin_len);
else else
return 0; return 0;
#endif #endif
PRINT(DEBUG, "received from %s\n", inet_ntoa(sin.sin_addr)); PRINT(DEBUG, "received from %s\n", inet_ntoa(sin.sin_addr));
/* check for errors */ /* check for errors */
if (received_bytes <= 0) { if (received_bytes <= 0) {
return 0; return 0;
} }
/* the signature of a BACnet/IP packet */ /* the signature of a BACnet/IP packet */
if (data->buff[0] != BVLL_TYPE_BACNET_IP) if (data->buff[0] != BVLL_TYPE_BACNET_IP)
return 0; return 0;
switch (data->buff[1]) { switch (data->buff[1]) {
case BVLC_ORIGINAL_UNICAST_NPDU: case BVLC_ORIGINAL_UNICAST_NPDU:
case BVLC_ORIGINAL_BROADCAST_NPDU: { case BVLC_ORIGINAL_BROADCAST_NPDU:{
if ((sin.sin_addr.s_addr == data->local_addr.s_addr) && if ((sin.sin_addr.s_addr == data->local_addr.s_addr) &&
(sin.sin_port == data->port)) { (sin.sin_port == data->port)) {
buff_len = 0; buff_len = 0;
PRINT(DEBUG, "BIP: src is me. Discarded!\n"); PRINT(DEBUG, "BIP: src is me. Discarded!\n");
} else { } else {
src->mac_len = 6; src->mac_len = 6;
memcpy(&src->mac[0], &sin.sin_addr.s_addr, 4); memcpy(&src->mac[0], &sin.sin_addr.s_addr, 4);
memcpy(&src->mac[4], &sin.sin_port, 2); memcpy(&src->mac[4], &sin.sin_port, 2);
(void) decode_unsigned16(&data->buff[2], &buff_len); (void) decode_unsigned16(&data->buff[2], &buff_len);
/* subtract off the BVLC header */ /* subtract off the BVLC header */
buff_len -= 4; buff_len -= 4;
if (buff_len < data->max_buff) { if (buff_len < data->max_buff) {
/* allocate data message stucture */ /* allocate data message stucture */
(*msg_data) = (MSG_DATA*)malloc(sizeof(MSG_DATA)); (*msg_data) = (MSG_DATA *) malloc(sizeof(MSG_DATA));
(*msg_data)->pdu_len = buff_len; (*msg_data)->pdu_len = buff_len;
(*msg_data)->pdu = (uint8_t*)malloc((*msg_data)->pdu_len); (*msg_data)->pdu =
/* fill up data message structure */ (uint8_t *) malloc((*msg_data)->pdu_len);
memmove(&(*msg_data)->pdu[0], &data->buff[4], (*msg_data)->pdu_len); /* fill up data message structure */
memmove(&(*msg_data)->src, src, sizeof(BACNET_ADDRESS)); memmove(&(*msg_data)->pdu[0], &data->buff[4],
} (*msg_data)->pdu_len);
/* ignore packets that are too large */ memmove(&(*msg_data)->src, src,
else { sizeof(BACNET_ADDRESS));
buff_len = 0; }
/* ignore packets that are too large */
else {
buff_len = 0;
PRINT(ERROR, "BIP: PDU too large. Discarded!.\n"); PRINT(ERROR, "BIP: PDU too large. Discarded!.\n");
} }
} }
} }
break; break;
case BVLC_FORWARDED_NPDU: { case BVLC_FORWARDED_NPDU:{
memcpy(&sin.sin_addr.s_addr, &data->buff[4], 4); memcpy(&sin.sin_addr.s_addr, &data->buff[4], 4);
memcpy(&sin.sin_port, &data->buff[8], 2); memcpy(&sin.sin_port, &data->buff[8], 2);
if ((sin.sin_addr.s_addr == data->local_addr.s_addr) && if ((sin.sin_addr.s_addr == data->local_addr.s_addr) &&
(sin.sin_port == data->port)) { (sin.sin_port == data->port)) {
buff_len = 0; buff_len = 0;
} else { } else {
src->mac_len = 6; src->mac_len = 6;
memcpy(&src->mac[0], &sin.sin_addr.s_addr, 4); memcpy(&src->mac[0], &sin.sin_addr.s_addr, 4);
memcpy(&src->mac[4], &sin.sin_port, 2); memcpy(&src->mac[4], &sin.sin_port, 2);
(void) decode_unsigned16(&data->buff[2], &buff_len); (void) decode_unsigned16(&data->buff[2], &buff_len);
/* subtract off the BVLC header */ /* subtract off the BVLC header */
buff_len -= 10; buff_len -= 10;
if (buff_len < data->max_buff) { if (buff_len < data->max_buff) {
/* allocate data message stucture */ /* allocate data message stucture */
(*msg_data) = (MSG_DATA*)malloc(sizeof(MSG_DATA)); (*msg_data) = (MSG_DATA *) malloc(sizeof(MSG_DATA));
(*msg_data)->pdu_len = buff_len; (*msg_data)->pdu_len = buff_len;
(*msg_data)->pdu = (uint8_t*)malloc((*msg_data)->pdu_len); (*msg_data)->pdu =
/* fill up data message structure */ (uint8_t *) malloc((*msg_data)->pdu_len);
memmove(&(*msg_data)->pdu, &data->buff[4+6], (*msg_data)->pdu_len); /* fill up data message structure */
memmove(&(*msg_data)->src, src, sizeof(BACNET_ADDRESS)); memmove(&(*msg_data)->pdu, &data->buff[4 + 6],
} else { (*msg_data)->pdu_len);
/* ignore packets that are too large */ memmove(&(*msg_data)->src, src,
buff_len = 0; sizeof(BACNET_ADDRESS));
} } else {
} /* ignore packets that are too large */
} buff_len = 0;
break; }
default: }
}
break;
default:
PRINT(ERROR, "BIP: BVLC discarded!\n"); PRINT(ERROR, "BIP: BVLC discarded!\n");
break; break;
} }
return buff_len; return buff_len;
} }
void dl_ip_cleanup( void dl_ip_cleanup(
IP_DATA *ip_data) { IP_DATA * ip_data)
/* free buffer */ {
if (ip_data->buff) /* free buffer */
free(ip_data->buff); if (ip_data->buff)
/* close socket */ free(ip_data->buff);
if (ip_data->socket > 0) /* close socket */
close(ip_data->socket); if (ip_data->socket > 0)
return; close(ip_data->socket);
return;
} }
+21 -21
View File
@@ -26,36 +26,36 @@ Copyright (C) 2012 Andriy Sukhynyuk, Vasyl Tkhir, Andriy Ivasiv
#define MAX_BIP_PDU (MAX_NPDU + MAX_BIP_APDU) #define MAX_BIP_PDU (MAX_NPDU + MAX_BIP_APDU)
#define MAX_BIP_MPDU (MAX_HEADER + MAX_BIP_PDU) #define MAX_BIP_MPDU (MAX_HEADER + MAX_BIP_PDU)
typedef struct ip_data { typedef struct ip_data {
int socket; int socket;
uint16_t port; uint16_t port;
struct in_addr local_addr; struct in_addr local_addr;
struct in_addr broadcast_addr; struct in_addr broadcast_addr;
uint8_t *buff; uint8_t *buff;
uint16_t max_buff; uint16_t max_buff;
} IP_DATA; } IP_DATA;
void* dl_ip_thread( void *dl_ip_thread(
void *pArgs); void *pArgs);
bool dl_ip_init( bool dl_ip_init(
ROUTER_PORT *port, ROUTER_PORT * port,
IP_DATA *data); IP_DATA * data);
int dl_ip_send( int dl_ip_send(
IP_DATA *data, IP_DATA * data,
BACNET_ADDRESS *dest, BACNET_ADDRESS * dest,
uint8_t *pdu, uint8_t * pdu,
unsigned pdu_len); unsigned pdu_len);
int dl_ip_recv( int dl_ip_recv(
IP_DATA *data, IP_DATA * data,
MSG_DATA **msg, /* on recieve fill up message */ MSG_DATA ** msg, /* on recieve fill up message */
BACNET_ADDRESS *src, BACNET_ADDRESS * src,
unsigned timeout); unsigned timeout);
void dl_ip_cleanup( void dl_ip_cleanup(
IP_DATA *data); IP_DATA * data);
#endif /* end of UDPMODULE_H */ #endif /* end of UDPMODULE_H */
File diff suppressed because it is too large Load Diff
+53 -46
View File
@@ -23,73 +23,80 @@ Copyright (C) 2012 Andriy Sukhynyuk, Vasyl Tkhir, Andriy Ivasiv
pthread_mutex_t msg_lock = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t msg_lock = PTHREAD_MUTEX_INITIALIZER;
MSGBOX_ID create_msgbox() { MSGBOX_ID create_msgbox(
MSGBOX_ID msgboxid; )
{
MSGBOX_ID msgboxid;
msgboxid = msgget(IPC_PRIVATE, 0666 | IPC_CREAT); msgboxid = msgget(IPC_PRIVATE, 0666 | IPC_CREAT);
if (msgboxid == INVALID_MSGBOX_ID) { if (msgboxid == INVALID_MSGBOX_ID) {
return INVALID_MSGBOX_ID; return INVALID_MSGBOX_ID;
} }
return msgboxid; return msgboxid;
} }
bool send_to_msgbox( bool send_to_msgbox(
MSGBOX_ID dest, MSGBOX_ID dest,
BACMSG *msg) { BACMSG * msg)
{
int err; int err;
err = msgsnd(dest, msg, sizeof(BACMSG), 0); err = msgsnd(dest, msg, sizeof(BACMSG), 0);
if (err) { if (err) {
return false; return false;
} }
return true; return true;
} }
BACMSG* recv_from_msgbox( BACMSG *recv_from_msgbox(
MSGBOX_ID src, MSGBOX_ID src,
BACMSG *msg) { BACMSG * msg)
{
int recv_bytes; int recv_bytes;
recv_bytes = msgrcv(src, msg, sizeof(BACMSG), 0, IPC_NOWAIT); recv_bytes = msgrcv(src, msg, sizeof(BACMSG), 0, IPC_NOWAIT);
if (recv_bytes > 0) { if (recv_bytes > 0) {
return msg; return msg;
} else { } else {
return NULL; return NULL;
} }
} }
void del_msgbox( void del_msgbox(
MSGBOX_ID msgboxid) { MSGBOX_ID msgboxid)
{
if (msgboxid == INVALID_MSGBOX_ID) if (msgboxid == INVALID_MSGBOX_ID)
return; return;
else else
msgctl(msgboxid, IPC_RMID, NULL); msgctl(msgboxid, IPC_RMID, NULL);
} }
void free_data( void free_data(
MSG_DATA *data) { MSG_DATA * data)
{
if (data->pdu) { if (data->pdu) {
free(data->pdu); free(data->pdu);
data->pdu = NULL; data->pdu = NULL;
} }
if (data) { if (data) {
free(data); free(data);
data = NULL; data = NULL;
} }
} }
void check_data( void check_data(
MSG_DATA *data) { MSG_DATA * data)
{
/* lock and decrement messages reference count */ /* lock and decrement messages reference count */
pthread_mutex_lock(&msg_lock); pthread_mutex_lock(&msg_lock);
if (--data->ref_count == 0) { if (--data->ref_count == 0) {
free_data(data); free_data(data);
} }
pthread_mutex_unlock(&msg_lock); pthread_mutex_unlock(&msg_lock);
} }
+25 -24
View File
@@ -32,54 +32,55 @@ extern pthread_mutex_t msg_lock;
typedef int MSGBOX_ID; typedef int MSGBOX_ID;
typedef enum { typedef enum {
DATA, DATA,
SERVICE SERVICE
} MSGTYPE; } MSGTYPE;
typedef enum { typedef enum {
SHUTDOWN, SHUTDOWN,
CHG_IP, CHG_IP,
CHG_MAC CHG_MAC
} MSGSUBTYPE; } MSGSUBTYPE;
typedef struct _message { typedef struct _message {
MSGBOX_ID origin; MSGBOX_ID origin;
MSGTYPE type; MSGTYPE type;
MSGSUBTYPE subtype; MSGSUBTYPE subtype;
void *data; void *data;
/* add timestamp */ /* add timestamp */
} BACMSG; } BACMSG;
/* specific message type data structures */ /* specific message type data structures */
typedef struct _msg_data { typedef struct _msg_data {
BACNET_ADDRESS dest; BACNET_ADDRESS dest;
BACNET_ADDRESS src; BACNET_ADDRESS src;
uint8_t *pdu; uint8_t *pdu;
uint16_t pdu_len; uint16_t pdu_len;
uint8_t ref_count; uint8_t ref_count;
} MSG_DATA; } MSG_DATA;
MSGBOX_ID create_msgbox(); MSGBOX_ID create_msgbox(
);
/* returns sent byte count */ /* returns sent byte count */
bool send_to_msgbox( bool send_to_msgbox(
MSGBOX_ID dest, MSGBOX_ID dest,
BACMSG *msg); BACMSG * msg);
/* returns received message */ /* returns received message */
BACMSG* recv_from_msgbox( BACMSG *recv_from_msgbox(
MSGBOX_ID src, MSGBOX_ID src,
BACMSG *msg); BACMSG * msg);
void del_msgbox( void del_msgbox(
MSGBOX_ID msgboxid); MSGBOX_ID msgboxid);
/* free message data structure */ /* free message data structure */
void free_data( void free_data(
MSG_DATA *data); MSG_DATA * data);
/* check message reference counter and delete data if needed */ /* check message reference counter and delete data if needed */
void check_data( void check_data(
MSG_DATA *data); MSG_DATA * data);
#endif /* end of MSGQUEUE_H */ #endif /* end of MSGQUEUE_H */
+113 -114
View File
@@ -29,140 +29,139 @@ Copyright (C) 2012 Andriy Sukhynyuk, Vasyl Tkhir, Andriy Ivasiv
#define mstp_thread_debug(...) #define mstp_thread_debug(...)
#endif #endif
void* dl_mstp_thread(void* pArgs) { void *dl_mstp_thread(
void *pArgs)
{
ROUTER_PORT *port = (ROUTER_PORT*)pArgs; ROUTER_PORT *port = (ROUTER_PORT *) pArgs;
struct mstp_port_struct_t mstp_port = {(MSTP_RECEIVE_STATE)0}; struct mstp_port_struct_t mstp_port = { (MSTP_RECEIVE_STATE) 0 };
volatile SHARED_MSTP_DATA shared_port_data = {0}; volatile SHARED_MSTP_DATA shared_port_data = { 0 };
uint16_t pdu_len; uint16_t pdu_len;
uint8_t shutdown = 0; uint8_t shutdown = 0;
shared_port_data.Treply_timeout = 260; shared_port_data.Treply_timeout = 260;
shared_port_data.MSTP_Packets = 0; shared_port_data.MSTP_Packets = 0;
shared_port_data.Tusage_timeout = 50; shared_port_data.Tusage_timeout = 50;
shared_port_data.RS485_Handle = -1; shared_port_data.RS485_Handle = -1;
shared_port_data.RS485_Baud = B38400; shared_port_data.RS485_Baud = B38400;
shared_port_data.RS485MOD = 0; shared_port_data.RS485MOD = 0;
switch(port->params.mstp_params.databits){ switch (port->params.mstp_params.databits) {
case 5: case 5:
shared_port_data.RS485MOD = CS5; shared_port_data.RS485MOD = CS5;
break; break;
case 6: case 6:
shared_port_data.RS485MOD = CS6; shared_port_data.RS485MOD = CS6;
break; break;
case 7: case 7:
shared_port_data.RS485MOD = CS7; shared_port_data.RS485MOD = CS7;
break; break;
default: default:
shared_port_data.RS485MOD = CS8; shared_port_data.RS485MOD = CS8;
break; break;
} }
switch(port->params.mstp_params.parity){ switch (port->params.mstp_params.parity) {
case PARITY_EVEN: case PARITY_EVEN:
shared_port_data.RS485MOD |= PARENB; shared_port_data.RS485MOD |= PARENB;
break; break;
case PARITY_ODD: case PARITY_ODD:
shared_port_data.RS485MOD |= PARENB | PARODD; shared_port_data.RS485MOD |= PARENB | PARODD;
break; break;
default: default:
break; break;
} }
if(port->params.mstp_params.stopbits == 2) if (port->params.mstp_params.stopbits == 2)
shared_port_data.RS485MOD |= CSTOPB; shared_port_data.RS485MOD |= CSTOPB;
mstp_port.UserData = (void*) &shared_port_data; mstp_port.UserData = (void *) &shared_port_data;
dlmstp_set_baud_rate(&mstp_port, port->params.mstp_params.baudrate); dlmstp_set_baud_rate(&mstp_port, port->params.mstp_params.baudrate);
dlmstp_set_mac_address(&mstp_port, port->route_info.mac[0]); dlmstp_set_mac_address(&mstp_port, port->route_info.mac[0]);
dlmstp_set_max_info_frames(&mstp_port, port->params.mstp_params.max_frames); dlmstp_set_max_info_frames(&mstp_port,
dlmstp_set_max_master(&mstp_port, port->params.mstp_params.max_master); port->params.mstp_params.max_frames);
if(!dlmstp_init(&mstp_port, port->iface)) dlmstp_set_max_master(&mstp_port, port->params.mstp_params.max_master);
printf("MSTP %s init failed. Stop.\n", port->iface); if (!dlmstp_init(&mstp_port, port->iface))
printf("MSTP %s init failed. Stop.\n", port->iface);
port->port_id = create_msgbox(); port->port_id = create_msgbox();
if (port->port_id == INVALID_MSGBOX_ID) { if (port->port_id == INVALID_MSGBOX_ID) {
port->state = INIT_FAILED; port->state = INIT_FAILED;
return NULL; return NULL;
} }
port->state = RUNNING; port->state = RUNNING;
while (!shutdown) { while (!shutdown) {
/* message loop */ /* message loop */
BACMSG msg_storage, * bacmsg; BACMSG msg_storage, *bacmsg;
MSG_DATA * msg_data; MSG_DATA *msg_data;
bacmsg = recv_from_msgbox(port->port_id, &msg_storage); bacmsg = recv_from_msgbox(port->port_id, &msg_storage);
if(bacmsg) if (bacmsg) {
{ switch (bacmsg->type) {
switch(bacmsg->type) case DATA:
{ msg_data = (MSG_DATA *) bacmsg->data;
case DATA:
msg_data = (MSG_DATA*) bacmsg->data;
if(msg_data->dest.net == BACNET_BROADCAST_NETWORK) if (msg_data->dest.net == BACNET_BROADCAST_NETWORK) {
{ dlmstp_get_broadcast_address(&(msg_data->dest));
dlmstp_get_broadcast_address(&(msg_data->dest)); } else {
} msg_data->dest.mac[0] = msg_data->dest.adr[0];
else msg_data->dest.mac_len = 1;
{ }
msg_data->dest.mac[0] = msg_data->dest.adr[0];
msg_data->dest.mac_len = 1;
}
dlmstp_send_pdu(&mstp_port, &(msg_data->dest), msg_data->pdu, msg_data->pdu_len); dlmstp_send_pdu(&mstp_port, &(msg_data->dest),
msg_data->pdu, msg_data->pdu_len);
check_data(msg_data); check_data(msg_data);
break; break;
case SERVICE: case SERVICE:
switch(bacmsg->subtype) { switch (bacmsg->subtype) {
case SHUTDOWN: case SHUTDOWN:
shutdown = 1; shutdown = 1;
break; break;
default: default:
break; break;
} }
break; break;
default: default:
continue; continue;
break; break;
} }
} } else {
else pdu_len = dlmstp_receive(&mstp_port, NULL, NULL, 0, 1000);
{
pdu_len = dlmstp_receive(&mstp_port, NULL, NULL, 0, 1000);
if(pdu_len > 0) if (pdu_len > 0) {
{ msg_data = (MSG_DATA *) malloc(sizeof(MSG_DATA));
msg_data = (MSG_DATA*)malloc(sizeof(MSG_DATA)); memmove(&(msg_data->src),
memmove(&(msg_data->src), (const void*)&(shared_port_data.Receive_Packet.address), sizeof(shared_port_data.Receive_Packet.address)); (const void *) &(shared_port_data.Receive_Packet.address),
msg_data->src.adr[0] = msg_data->src.mac[0]; sizeof(shared_port_data.Receive_Packet.address));
msg_data->src.len = 1; msg_data->src.adr[0] = msg_data->src.mac[0];
msg_data->pdu = (uint8_t*)malloc(pdu_len); msg_data->src.len = 1;
memmove(msg_data->pdu, (const void*)&(shared_port_data.Receive_Packet.pdu), pdu_len); msg_data->pdu = (uint8_t *) malloc(pdu_len);
msg_data->pdu_len = pdu_len; memmove(msg_data->pdu,
(const void *) &(shared_port_data.Receive_Packet.pdu),
pdu_len);
msg_data->pdu_len = pdu_len;
msg_storage.type = DATA; msg_storage.type = DATA;
msg_storage.subtype = (MSGSUBTYPE)0; msg_storage.subtype = (MSGSUBTYPE) 0;
msg_storage.origin = port->port_id; msg_storage.origin = port->port_id;
msg_storage.data = msg_data; msg_storage.data = msg_data;
if(!send_to_msgbox(port->main_id, &msg_storage)) if (!send_to_msgbox(port->main_id, &msg_storage)) {
{ free_data(msg_data);
free_data(msg_data); }
} }
} }
} }
}
dlmstp_cleanup(&mstp_port); dlmstp_cleanup(&mstp_port);
port->state = FINISHED; port->state = FINISHED;
return NULL; return NULL;
} }
+2 -2
View File
@@ -19,7 +19,7 @@ Copyright (C) 2012 Andriy Sukhynyuk, Vasyl Tkhir, Andriy Ivasiv
#include "portthread.h" #include "portthread.h"
void* dl_mstp_thread( void *dl_mstp_thread(
void* pArgs); void *pArgs);
#endif /* end of MSTPMODULE_H */ #endif /* end of MSTPMODULE_H */
+263 -247
View File
@@ -21,291 +21,307 @@ Copyright (C) 2012 Andriy Sukhynyuk, Vasyl Tkhir, Andriy Ivasiv
#include "bacint.h" #include "bacint.h"
uint16_t process_network_message( uint16_t process_network_message(
BACMSG *msg, BACMSG * msg,
MSG_DATA *data, MSG_DATA * data,
uint8_t **buff) { uint8_t ** buff)
{
BACNET_NPDU_DATA npdu_data; BACNET_NPDU_DATA npdu_data;
ROUTER_PORT *srcport; ROUTER_PORT *srcport;
ROUTER_PORT *destport; ROUTER_PORT *destport;
uint16_t net; uint16_t net;
uint8_t error_code; uint8_t error_code;
int16_t buff_len = 0; int16_t buff_len = 0;
int apdu_offset; int apdu_offset;
int apdu_len; int apdu_len;
memmove(data, msg->data, sizeof(MSG_DATA)); memmove(data, msg->data, sizeof(MSG_DATA));
apdu_offset = npdu_decode(data->pdu, &data->dest, NULL, &npdu_data); apdu_offset = npdu_decode(data->pdu, &data->dest, NULL, &npdu_data);
apdu_len = data->pdu_len - apdu_offset; apdu_len = data->pdu_len - apdu_offset;
srcport = find_snet(msg->origin); srcport = find_snet(msg->origin);
data->src.net = srcport->route_info.net; data->src.net = srcport->route_info.net;
switch (npdu_data.network_message_type) { switch (npdu_data.network_message_type) {
case NETWORK_MESSAGE_WHO_IS_ROUTER_TO_NETWORK: case NETWORK_MESSAGE_WHO_IS_ROUTER_TO_NETWORK:
PRINT(INFO, "Recieved Who-Is-Router-To-Network message\n"); PRINT(INFO, "Recieved Who-Is-Router-To-Network message\n");
if (apdu_len) { if (apdu_len) {
/* if NET specified */ /* if NET specified */
decode_unsigned16(&data->pdu[apdu_offset], &net); decode_unsigned16(&data->pdu[apdu_offset], &net);
if (srcport->route_info.net == net) { if (srcport->route_info.net == net) {
PRINT(INFO, "Message discarded: NET directly connected\n"); PRINT(INFO, "Message discarded: NET directly connected\n");
return -2; return -2;
} }
destport = find_dnet(net, NULL); /* see if NET can be reached */ destport = find_dnet(net, NULL); /* see if NET can be reached */
if (destport) { if (destport) {
/* if TRUE send reply */ /* if TRUE send reply */
PRINT(INFO, "Sending I-Am-Router-To-Network message\n"); PRINT(INFO, "Sending I-Am-Router-To-Network message\n");
buff_len = create_network_message(NETWORK_MESSAGE_I_AM_ROUTER_TO_NETWORK, buff_len =
data, buff, &net); create_network_message
} else { (NETWORK_MESSAGE_I_AM_ROUTER_TO_NETWORK, data, buff,
data->dest.net = net; /* NET to look for */ &net);
return -1; /* else initiate NET search procedure */ } else {
} data->dest.net = net; /* NET to look for */
} else { return -1; /* else initiate NET search procedure */
/* if NET is omitted (message sent with -1) */ }
PRINT(INFO, "Sending I-Am-Router-To-Network message\n"); } else {
buff_len = create_network_message(NETWORK_MESSAGE_I_AM_ROUTER_TO_NETWORK, /* if NET is omitted (message sent with -1) */
data, buff, NULL); PRINT(INFO, "Sending I-Am-Router-To-Network message\n");
} buff_len =
create_network_message
(NETWORK_MESSAGE_I_AM_ROUTER_TO_NETWORK, data, buff, NULL);
}
break; break;
case NETWORK_MESSAGE_I_AM_ROUTER_TO_NETWORK: case NETWORK_MESSAGE_I_AM_ROUTER_TO_NETWORK:
{ {
PRINT(INFO, "Recieved I-Am-Router-To-Network message\n"); PRINT(INFO, "Recieved I-Am-Router-To-Network message\n");
int net_count = apdu_len / 2; int net_count = apdu_len / 2;
int i; int i;
for (i = 0; i < net_count; i++) { for (i = 0; i < net_count; i++) {
decode_unsigned16(&data->pdu[apdu_offset+2*i], &net); /* decode received NET values */ decode_unsigned16(&data->pdu[apdu_offset + 2 * i], &net); /* decode received NET values */
add_dnet(&srcport->route_info, net, data->src); /* and update routing table */ add_dnet(&srcport->route_info, net, data->src); /* and update routing table */
} }
break; break;
} }
case NETWORK_MESSAGE_REJECT_MESSAGE_TO_NETWORK: case NETWORK_MESSAGE_REJECT_MESSAGE_TO_NETWORK:
{ {
/* first octet of the message contains rejection reason */ /* first octet of the message contains rejection reason */
/* next two octets contain NET (can be decoded for additional info on error) */ /* next two octets contain NET (can be decoded for additional info on error) */
error_code = data->pdu[apdu_offset]; error_code = data->pdu[apdu_offset];
switch (error_code) { switch (error_code) {
case 0: case 0:
PRINT(ERROR, "Error!\n"); PRINT(ERROR, "Error!\n");
break; break;
case 1: case 1:
PRINT(ERROR, "Error: Network unreachable\n"); PRINT(ERROR, "Error: Network unreachable\n");
break; break;
case 2: case 2:
PRINT(ERROR, "Error: Network is busy\n"); PRINT(ERROR, "Error: Network is busy\n");
break; break;
case 3: case 3:
PRINT(ERROR, "Error: Unknown network message type\n"); PRINT(ERROR, "Error: Unknown network message type\n");
break; break;
case 4: case 4:
PRINT(ERROR, "Error: Message too long\n"); PRINT(ERROR, "Error: Message too long\n");
break; break;
} }
break; break;
} }
case NETWORK_MESSAGE_INIT_RT_TABLE: case NETWORK_MESSAGE_INIT_RT_TABLE:
PRINT(INFO, "Recieved Initialize-Routing-Table message\n"); PRINT(INFO, "Recieved Initialize-Routing-Table message\n");
if (data->pdu[apdu_offset] > 0) { if (data->pdu[apdu_offset] > 0) {
int net_count = data->pdu[apdu_offset]; int net_count = data->pdu[apdu_offset];
while (net_count--) { while (net_count--) {
int i = 1; int i = 1;
decode_unsigned16(&data->pdu[apdu_offset+i], &net); /* decode received NET values */ decode_unsigned16(&data->pdu[apdu_offset + i], &net); /* decode received NET values */
add_dnet(&srcport->route_info, net, data->src); /* and update routing table */ add_dnet(&srcport->route_info, net, data->src); /* and update routing table */
if (data->pdu[apdu_offset+i+3] > 0) /* find next NET value */ if (data->pdu[apdu_offset + i + 3] > 0) /* find next NET value */
i = data->pdu[apdu_offset+i+3] + 4; i = data->pdu[apdu_offset + i + 3] + 4;
else else
i = i + 4; i = i + 4;
} }
buff_len = create_network_message(NETWORK_MESSAGE_INIT_RT_TABLE_ACK, data, buff, NULL); buff_len =
} else create_network_message(NETWORK_MESSAGE_INIT_RT_TABLE_ACK,
buff_len = create_network_message(NETWORK_MESSAGE_INIT_RT_TABLE_ACK, data, buff, &buff); data, buff, NULL);
break; } else
buff_len =
create_network_message(NETWORK_MESSAGE_INIT_RT_TABLE_ACK,
data, buff, &buff);
break;
case NETWORK_MESSAGE_INIT_RT_TABLE_ACK: case NETWORK_MESSAGE_INIT_RT_TABLE_ACK:
PRINT(INFO, "Recieved Initialize-Routing-Table-Ack message\n"); PRINT(INFO, "Recieved Initialize-Routing-Table-Ack message\n");
if (data->pdu[apdu_offset] > 0) { if (data->pdu[apdu_offset] > 0) {
int net_count = data->pdu[apdu_offset]; int net_count = data->pdu[apdu_offset];
while (net_count--) { while (net_count--) {
int i = 1; int i = 1;
decode_unsigned16(&data->pdu[apdu_offset+i], &net); /* decode received NET values */ decode_unsigned16(&data->pdu[apdu_offset + i], &net); /* decode received NET values */
add_dnet(&srcport->route_info, net, data->src); /* and update routing table */ add_dnet(&srcport->route_info, net, data->src); /* and update routing table */
if (data->pdu[apdu_offset+i+3] > 0) /* find next NET value */ if (data->pdu[apdu_offset + i + 3] > 0) /* find next NET value */
i = data->pdu[apdu_offset+i+3] + 4; i = data->pdu[apdu_offset + i + 3] + 4;
else else
i = i + 4; i = i + 4;
} }
} }
break; break;
case NETWORK_MESSAGE_INVALID: case NETWORK_MESSAGE_INVALID:
case NETWORK_MESSAGE_I_COULD_BE_ROUTER_TO_NETWORK: case NETWORK_MESSAGE_I_COULD_BE_ROUTER_TO_NETWORK:
case NETWORK_MESSAGE_ROUTER_BUSY_TO_NETWORK: case NETWORK_MESSAGE_ROUTER_BUSY_TO_NETWORK:
case NETWORK_MESSAGE_ROUTER_AVAILABLE_TO_NETWORK: case NETWORK_MESSAGE_ROUTER_AVAILABLE_TO_NETWORK:
case NETWORK_MESSAGE_ESTABLISH_CONNECTION_TO_NETWORK: case NETWORK_MESSAGE_ESTABLISH_CONNECTION_TO_NETWORK:
case NETWORK_MESSAGE_DISCONNECT_CONNECTION_TO_NETWORK: case NETWORK_MESSAGE_DISCONNECT_CONNECTION_TO_NETWORK:
/* hell if I know what to do with these messages */ /* hell if I know what to do with these messages */
break; break;
default: default:
PRINT(ERROR, "Error: Message unsupported\n"); PRINT(ERROR, "Error: Message unsupported\n");
break; break;
} }
return buff_len; return buff_len;
} }
uint16_t create_network_message( uint16_t create_network_message(
BACNET_NETWORK_MESSAGE_TYPE network_message_type, BACNET_NETWORK_MESSAGE_TYPE network_message_type,
MSG_DATA *data, MSG_DATA * data,
uint8_t **buff, uint8_t ** buff,
void *val) { void *val)
{
int16_t buff_len; int16_t buff_len;
bool data_expecting_reply = false; bool data_expecting_reply = false;
BACNET_NPDU_DATA npdu_data; BACNET_NPDU_DATA npdu_data;
if (network_message_type == NETWORK_MESSAGE_INIT_RT_TABLE) if (network_message_type == NETWORK_MESSAGE_INIT_RT_TABLE)
data_expecting_reply = true; data_expecting_reply = true;
init_npdu(&npdu_data, network_message_type, data_expecting_reply); init_npdu(&npdu_data, network_message_type, data_expecting_reply);
*buff = (uint8_t*)malloc(128); /* resolve different length */ *buff = (uint8_t *) malloc(128); /* resolve different length */
/* manual destination setup for Init-RT-Table-Ack message */ /* manual destination setup for Init-RT-Table-Ack message */
data->dest.net = BACNET_BROADCAST_NETWORK; data->dest.net = BACNET_BROADCAST_NETWORK;
buff_len = npdu_encode_pdu(*buff, &data->dest, NULL, &npdu_data); buff_len = npdu_encode_pdu(*buff, &data->dest, NULL, &npdu_data);
switch (network_message_type) { switch (network_message_type) {
case NETWORK_MESSAGE_WHO_IS_ROUTER_TO_NETWORK: case NETWORK_MESSAGE_WHO_IS_ROUTER_TO_NETWORK:
if (val != NULL) { if (val != NULL) {
uint8_t * valptr = (uint8_t*)val; uint8_t *valptr = (uint8_t *) val;
uint16_t val16 = (valptr[0]) + (valptr[1] << 8); uint16_t val16 = (valptr[0]) + (valptr[1] << 8);
buff_len += encode_unsigned16(*buff+buff_len, val16); buff_len += encode_unsigned16(*buff + buff_len, val16);
} }
break; break;
case NETWORK_MESSAGE_I_AM_ROUTER_TO_NETWORK: case NETWORK_MESSAGE_I_AM_ROUTER_TO_NETWORK:
if (val != NULL) { if (val != NULL) {
uint8_t * valptr = (uint8_t*)val; uint8_t *valptr = (uint8_t *) val;
uint16_t val16 = (valptr[0]) + (valptr[1] << 8); uint16_t val16 = (valptr[0]) + (valptr[1] << 8);
buff_len += encode_unsigned16(*buff+buff_len, val16); buff_len += encode_unsigned16(*buff + buff_len, val16);
} } else {
else { ROUTER_PORT *port = head;
ROUTER_PORT *port = head; DNET *dnet;
DNET *dnet; while (port != NULL) {
while (port != NULL) { if (port->route_info.net != data->src.net) {
if (port->route_info.net != data->src.net) { buff_len +=
buff_len += encode_unsigned16(*buff+buff_len, port->route_info.net); encode_unsigned16(*buff + buff_len,
dnet = port->route_info.dnets; port->route_info.net);
while (dnet != NULL) { dnet = port->route_info.dnets;
buff_len += encode_unsigned16(*buff+buff_len, dnet->net); while (dnet != NULL) {
dnet = dnet->next; buff_len +=
} encode_unsigned16(*buff + buff_len, dnet->net);
port = port->next; dnet = dnet->next;
} else { }
dnet = port->route_info.dnets; port = port->next;
while (dnet != NULL) { } else {
buff_len += encode_unsigned16(*buff+buff_len, dnet->net); dnet = port->route_info.dnets;
dnet = dnet->next; while (dnet != NULL) {
} buff_len +=
port = port->next; encode_unsigned16(*buff + buff_len, dnet->net);
} dnet = dnet->next;
} }
} port = port->next;
break; }
}
}
break;
case NETWORK_MESSAGE_REJECT_MESSAGE_TO_NETWORK: case NETWORK_MESSAGE_REJECT_MESSAGE_TO_NETWORK:
{ {
uint8_t * valptr = (uint8_t*)val; uint8_t *valptr = (uint8_t *) val;
uint16_t val16 = (valptr[0]) + (valptr[1] << 8); uint16_t val16 = (valptr[0]) + (valptr[1] << 8);
buff_len += encode_unsigned16(*buff + buff_len, val16); buff_len += encode_unsigned16(*buff + buff_len, val16);
break; break;
} }
case NETWORK_MESSAGE_INIT_RT_TABLE: case NETWORK_MESSAGE_INIT_RT_TABLE:
case NETWORK_MESSAGE_INIT_RT_TABLE_ACK: case NETWORK_MESSAGE_INIT_RT_TABLE_ACK:
if ((uint8_t*)val) { if ((uint8_t *) val) {
(*buff)[buff_len++] = (uint8_t) port_count; (*buff)[buff_len++] = (uint8_t) port_count;
if (port_count > 0) { if (port_count > 0) {
ROUTER_PORT *port = head; ROUTER_PORT *port = head;
uint8_t portID = 1; uint8_t portID = 1;
while (port != NULL) { while (port != NULL) {
buff_len += encode_unsigned16(*buff+buff_len, port->route_info.net); buff_len +=
(*buff)[buff_len++] = portID++; encode_unsigned16(*buff + buff_len,
(*buff)[buff_len++] = 0; port->route_info.net);
port = port->next; (*buff)[buff_len++] = portID++;
} (*buff)[buff_len++] = 0;
} port = port->next;
} else }
(*buff)[buff_len++] = (uint8_t) 0; }
break; } else
(*buff)[buff_len++] = (uint8_t) 0;
break;
case NETWORK_MESSAGE_INVALID: case NETWORK_MESSAGE_INVALID:
case NETWORK_MESSAGE_I_COULD_BE_ROUTER_TO_NETWORK: case NETWORK_MESSAGE_I_COULD_BE_ROUTER_TO_NETWORK:
case NETWORK_MESSAGE_ROUTER_BUSY_TO_NETWORK: case NETWORK_MESSAGE_ROUTER_BUSY_TO_NETWORK:
case NETWORK_MESSAGE_ROUTER_AVAILABLE_TO_NETWORK: case NETWORK_MESSAGE_ROUTER_AVAILABLE_TO_NETWORK:
case NETWORK_MESSAGE_ESTABLISH_CONNECTION_TO_NETWORK: case NETWORK_MESSAGE_ESTABLISH_CONNECTION_TO_NETWORK:
case NETWORK_MESSAGE_DISCONNECT_CONNECTION_TO_NETWORK: case NETWORK_MESSAGE_DISCONNECT_CONNECTION_TO_NETWORK:
/* hell if I know what to do with these messages */ /* hell if I know what to do with these messages */
break; break;
} }
return buff_len; return buff_len;
} }
void send_network_message( void send_network_message(
BACNET_NETWORK_MESSAGE_TYPE network_message_type, BACNET_NETWORK_MESSAGE_TYPE network_message_type,
MSG_DATA *data, MSG_DATA * data,
uint8_t **buff, uint8_t ** buff,
void *val) { void *val)
{
BACMSG msg; BACMSG msg;
ROUTER_PORT *port = head; ROUTER_PORT *port = head;
int16_t buff_len; int16_t buff_len;
if (!data) { if (!data) {
data = (MSG_DATA*)malloc(sizeof(MSG_DATA)); data = (MSG_DATA *) malloc(sizeof(MSG_DATA));
data->dest.net = BACNET_BROADCAST_NETWORK; data->dest.net = BACNET_BROADCAST_NETWORK;
} }
buff_len = create_network_message(network_message_type, data, buff, val); buff_len = create_network_message(network_message_type, data, buff, val);
/* form network message */ /* form network message */
data->pdu = *buff; data->pdu = *buff;
data->pdu_len = buff_len; data->pdu_len = buff_len;
msg.origin = head->main_id; msg.origin = head->main_id;
msg.type = DATA; msg.type = DATA;
msg.data = data; msg.data = data;
data->ref_count = port_count; data->ref_count = port_count;
while (port != NULL) { while (port != NULL) {
if (port->state == FINISHED) { if (port->state == FINISHED) {
port = port->next; port = port->next;
continue; continue;
} }
send_to_msgbox(port->port_id, &msg); send_to_msgbox(port->port_id, &msg);
port = port->next; port = port->next;
} }
} }
void init_npdu( void init_npdu(
BACNET_NPDU_DATA *npdu_data, BACNET_NPDU_DATA * npdu_data,
BACNET_NETWORK_MESSAGE_TYPE network_message_type, BACNET_NETWORK_MESSAGE_TYPE network_message_type,
bool data_expecting_reply) { bool data_expecting_reply)
{
if (npdu_data) { if (npdu_data) {
npdu_data->data_expecting_reply = data_expecting_reply; npdu_data->data_expecting_reply = data_expecting_reply;
npdu_data->protocol_version = BACNET_PROTOCOL_VERSION; npdu_data->protocol_version = BACNET_PROTOCOL_VERSION;
npdu_data->network_layer_message = true; npdu_data->network_layer_message = true;
npdu_data->network_message_type = network_message_type; npdu_data->network_message_type = network_message_type;
npdu_data->vendor_id = 0; npdu_data->vendor_id = 0;
npdu_data->priority = MESSAGE_PRIORITY_NORMAL; npdu_data->priority = MESSAGE_PRIORITY_NORMAL;
npdu_data->hop_count = HOP_COUNT_DEFAULT; npdu_data->hop_count = HOP_COUNT_DEFAULT;
} }
} }
+14 -14
View File
@@ -29,25 +29,25 @@ Copyright (C) 2012 Andriy Sukhynyuk, Vasyl Tkhir, Andriy Ivasiv
#include "portthread.h" #include "portthread.h"
uint16_t process_network_message( uint16_t process_network_message(
BACMSG *msg, BACMSG * msg,
MSG_DATA *data, MSG_DATA * data,
uint8_t **buff); uint8_t ** buff);
uint16_t create_network_message( uint16_t create_network_message(
BACNET_NETWORK_MESSAGE_TYPE network_message_type, BACNET_NETWORK_MESSAGE_TYPE network_message_type,
MSG_DATA *data, MSG_DATA * data,
uint8_t **buff, uint8_t ** buff,
void *val); void *val);
void send_network_message( void send_network_message(
BACNET_NETWORK_MESSAGE_TYPE network_message_type, BACNET_NETWORK_MESSAGE_TYPE network_message_type,
MSG_DATA *data, MSG_DATA * data,
uint8_t **buff, uint8_t ** buff,
void *val); void *val);
void init_npdu( void init_npdu(
BACNET_NPDU_DATA *npdu_data, BACNET_NPDU_DATA * npdu_data,
BACNET_NETWORK_MESSAGE_TYPE network_message_type, BACNET_NETWORK_MESSAGE_TYPE network_message_type,
bool data_expecting_reply); bool data_expecting_reply);
#endif /* end of NETWORK_LAYER_H */ #endif /* end of NETWORK_LAYER_H */
+76 -72
View File
@@ -19,98 +19,102 @@ Copyright (C) 2012 Andriy Sukhynyuk, Vasyl Tkhir, Andriy Ivasiv
#include <string.h> #include <string.h>
#include "portthread.h" #include "portthread.h"
ROUTER_PORT* find_snet( ROUTER_PORT *find_snet(
MSGBOX_ID id) { MSGBOX_ID id)
{
ROUTER_PORT *port = head; ROUTER_PORT *port = head;
while (port != NULL) { while (port != NULL) {
if (port->port_id == id) if (port->port_id == id)
return port; return port;
port = port->next; port = port->next;
} }
return NULL; return NULL;
} }
ROUTER_PORT* find_dnet( ROUTER_PORT *find_dnet(
uint16_t net, uint16_t net,
BACNET_ADDRESS *addr) { BACNET_ADDRESS * addr)
{
ROUTER_PORT *port = head; ROUTER_PORT *port = head;
DNET *dnet; DNET *dnet;
/* for broadcast messages no search is needed */ /* for broadcast messages no search is needed */
if (net == BACNET_BROADCAST_NETWORK) if (net == BACNET_BROADCAST_NETWORK)
return port; return port;
while(port != NULL) { while (port != NULL) {
/* check if DNET is directly connected to the router */ /* check if DNET is directly connected to the router */
if (net == port->route_info.net) if (net == port->route_info.net)
return port; return port;
/* else search router ports DNET list */ /* else search router ports DNET list */
else if (port->route_info.dnets) { else if (port->route_info.dnets) {
dnet = port->route_info.dnets; dnet = port->route_info.dnets;
while (dnet != NULL) { while (dnet != NULL) {
if (net == dnet->net) { if (net == dnet->net) {
if (addr) { if (addr) {
memmove(&addr->len, &dnet->mac_len, 1); memmove(&addr->len, &dnet->mac_len, 1);
memmove(&addr->adr[0], &dnet->mac[0], MAX_MAC_LEN); memmove(&addr->adr[0], &dnet->mac[0], MAX_MAC_LEN);
} }
return port; return port;
} }
dnet = dnet->next; dnet = dnet->next;
} }
} }
port = port->next; port = port->next;
} }
return NULL; return NULL;
} }
void add_dnet( void add_dnet(
RT_ENTRY *route_info, RT_ENTRY * route_info,
uint16_t net, uint16_t net,
BACNET_ADDRESS addr) { BACNET_ADDRESS addr)
{
DNET *dnet = route_info->dnets; DNET *dnet = route_info->dnets;
DNET *tmp; DNET *tmp;
if (dnet == NULL) { if (dnet == NULL) {
route_info->dnets = (DNET*)malloc(sizeof(DNET)); route_info->dnets = (DNET *) malloc(sizeof(DNET));
memmove(&route_info->dnets->mac_len, &addr.len, 1); memmove(&route_info->dnets->mac_len, &addr.len, 1);
memmove(&route_info->dnets->mac[0], &addr.adr[0], MAX_MAC_LEN); memmove(&route_info->dnets->mac[0], &addr.adr[0], MAX_MAC_LEN);
route_info->dnets->net = net; route_info->dnets->net = net;
route_info->dnets->state = true; route_info->dnets->state = true;
route_info->dnets->next = NULL; route_info->dnets->next = NULL;
} else { } else {
while (dnet != NULL) { while (dnet != NULL) {
if (dnet->net == net) /* make sure NETs are not repeated */ if (dnet->net == net) /* make sure NETs are not repeated */
return; return;
tmp = dnet; tmp = dnet;
dnet = dnet->next; dnet = dnet->next;
} }
dnet = (DNET*)malloc(sizeof(DNET)); dnet = (DNET *) malloc(sizeof(DNET));
memmove(&dnet->mac_len, &addr.len, 1); memmove(&dnet->mac_len, &addr.len, 1);
memmove(&dnet->mac[0], &addr.adr[0], MAX_MAC_LEN); memmove(&dnet->mac[0], &addr.adr[0], MAX_MAC_LEN);
dnet->net = net; dnet->net = net;
dnet->state = true; dnet->state = true;
dnet->next = NULL; dnet->next = NULL;
tmp->next = dnet; tmp->next = dnet;
} }
} }
void cleanup_dnets( void cleanup_dnets(
DNET *dnets) { DNET * dnets)
{
DNET *dnet = dnets; DNET *dnet = dnets;
while(dnet != NULL) { while (dnet != NULL) {
dnet = dnet->next; dnet = dnet->next;
free(dnets); free(dnets);
dnets = dnet; dnets = dnet;
} }
} }
+51 -50
View File
@@ -36,90 +36,91 @@ Copyright (C) 2012 Andriy Sukhynyuk, Vasyl Tkhir, Andriy Ivasiv
#endif #endif
typedef enum { typedef enum {
BIP = 1, BIP = 1,
MSTP = 2 MSTP = 2
} DL_TYPE; } DL_TYPE;
typedef enum { typedef enum {
INIT, INIT,
INIT_FAILED, INIT_FAILED,
RUNNING, RUNNING,
FINISHED FINISHED
} PORT_STATE; } PORT_STATE;
/* router port thread function */ /* router port thread function */
typedef void* (*PORT_FUNC)( typedef void *(
void*); *PORT_FUNC) (
void *);
typedef enum { typedef enum {
PARITY_NONE, PARITY_NONE,
PARITY_EVEN, PARITY_EVEN,
PARITY_ODD PARITY_ODD
}PARITY; } PARITY;
/* port specific parameters */ /* port specific parameters */
typedef union _port_params { typedef union _port_params {
struct { struct {
uint16_t port; uint16_t port;
} bip_params; } bip_params;
struct { struct {
uint32_t baudrate; uint32_t baudrate;
PARITY parity; PARITY parity;
uint8_t databits; uint8_t databits;
uint8_t stopbits; uint8_t stopbits;
uint8_t max_master; uint8_t max_master;
uint8_t max_frames; uint8_t max_frames;
} mstp_params; } mstp_params;
} PORT_PARAMS; } PORT_PARAMS;
/* list node for reacheble networks */ /* list node for reacheble networks */
typedef struct _dnet { typedef struct _dnet {
uint8_t mac[MAX_MAC_LEN]; uint8_t mac[MAX_MAC_LEN];
uint8_t mac_len; uint8_t mac_len;
uint16_t net; uint16_t net;
bool state; /* enabled or disabled */ bool state; /* enabled or disabled */
struct _dnet *next; struct _dnet *next;
} DNET; } DNET;
/* information for routing table */ /* information for routing table */
typedef struct _routing_table_entry { typedef struct _routing_table_entry {
uint8_t mac[MAX_MAC_LEN]; uint8_t mac[MAX_MAC_LEN];
uint8_t mac_len; uint8_t mac_len;
uint16_t net; uint16_t net;
DNET *dnets; DNET *dnets;
} RT_ENTRY; } RT_ENTRY;
typedef struct _port { typedef struct _port {
DL_TYPE type; DL_TYPE type;
PORT_STATE state; PORT_STATE state;
MSGBOX_ID main_id; /* same for every router port */ MSGBOX_ID main_id; /* same for every router port */
MSGBOX_ID port_id; /* different for every router port */ MSGBOX_ID port_id; /* different for every router port */
char *iface; char *iface;
PORT_FUNC func; PORT_FUNC func;
RT_ENTRY route_info; RT_ENTRY route_info;
PORT_PARAMS params; PORT_PARAMS params;
struct _port *next; /* pointer to next list node */ struct _port *next; /* pointer to next list node */
} ROUTER_PORT; } ROUTER_PORT;
extern ROUTER_PORT *head; extern ROUTER_PORT *head;
extern int port_count; extern int port_count;
/* get recieving router port */ /* get recieving router port */
ROUTER_PORT* find_snet( ROUTER_PORT *find_snet(
MSGBOX_ID id); MSGBOX_ID id);
/* get sending router port */ /* get sending router port */
ROUTER_PORT* find_dnet( ROUTER_PORT *find_dnet(
uint16_t net, uint16_t net,
BACNET_ADDRESS *addr); BACNET_ADDRESS * addr);
/* add reacheble network for specified router port */ /* add reacheble network for specified router port */
void add_dnet( void add_dnet(
RT_ENTRY *route_info, RT_ENTRY * route_info,
uint16_t net, uint16_t net,
BACNET_ADDRESS addr); BACNET_ADDRESS addr);
void cleanup_dnets( void cleanup_dnets(
DNET *dnets); DNET * dnets);
#endif /* end of PORTTHREAD_H */ #endif /* end of PORTTHREAD_H */
+2 -2
View File
@@ -151,7 +151,7 @@ int main(
0 0
}; /* address where message came from */ }; /* address where message came from */
uint16_t pdu_len = 0; uint16_t pdu_len = 0;
unsigned timeout = 1; /* milliseconds */ unsigned timeout = 1; /* milliseconds */
time_t last_seconds = 0; time_t last_seconds = 0;
time_t current_seconds = 0; time_t current_seconds = 0;
uint32_t elapsed_seconds = 0; uint32_t elapsed_seconds = 0;
@@ -188,7 +188,7 @@ int main(
npdu_handler(&src, &Rx_Buf[0], pdu_len); npdu_handler(&src, &Rx_Buf[0], pdu_len);
} }
/* at least one second has passed */ /* at least one second has passed */
elapsed_seconds = (uint32_t)(current_seconds - last_seconds); elapsed_seconds = (uint32_t) (current_seconds - last_seconds);
if (elapsed_seconds) { if (elapsed_seconds) {
last_seconds = current_seconds; last_seconds = current_seconds;
dcc_timer_seconds(elapsed_seconds); dcc_timer_seconds(elapsed_seconds);
+2 -2
View File
@@ -152,7 +152,7 @@ int main(
0 0
}; /* address where message came from */ }; /* address where message came from */
uint16_t pdu_len = 0; uint16_t pdu_len = 0;
unsigned timeout = 10; /* milliseconds */ unsigned timeout = 10; /* milliseconds */
unsigned max_apdu = 0; unsigned max_apdu = 0;
time_t elapsed_seconds = 0; time_t elapsed_seconds = 0;
time_t last_seconds = 0; time_t last_seconds = 0;
@@ -213,7 +213,7 @@ int main(
if (strcmp(argv[1], "broadcast") == 0) { if (strcmp(argv[1], "broadcast") == 0) {
Target_Broadcast = true; Target_Broadcast = true;
Target_DNET = BACNET_BROADCAST_NETWORK; Target_DNET = BACNET_BROADCAST_NETWORK;
} else if (strncmp(argv[1],"dnet=",5) == 0) { } else if (strncmp(argv[1], "dnet=", 5) == 0) {
Target_Broadcast = true; Target_Broadcast = true;
Target_DNET = strtol(&argv[1][5], NULL, 0); Target_DNET = strtol(&argv[1][5], NULL, 0);
} else { } else {
+21 -31
View File
@@ -113,8 +113,7 @@ static void print_usage(
char *filename) char *filename)
{ {
printf("Usage: %s [device-instance-min device-instance-min] " printf("Usage: %s [device-instance-min device-instance-min] "
"<object-type object-instance | object-name> [--help]\r\n", "<object-type object-instance | object-name> [--help]\r\n", filename);
filename);
} }
static void print_help( static void print_help(
@@ -123,12 +122,12 @@ static void print_help(
print_usage(filename); print_usage(filename);
printf("Send BACnet WhoHas request to devices, \r\n" printf("Send BACnet WhoHas request to devices, \r\n"
"and wait %u milliseconds (BACNET_APDU_TIMEOUT) for responses.\r\n" "and wait %u milliseconds (BACNET_APDU_TIMEOUT) for responses.\r\n"
"The device-instance-min or max can be 0 to %d.\r\n" "The device-instance-min or max can be 0 to %d.\r\n" "\r\n"
"\r\n" "Use either:\r\n" "The object-type can be 0 to %d.\r\n" "Use either:\r\n" "The object-type can be 0 to %d.\r\n"
"The object-instance can be 0 to %d.\r\n" "or:\r\n" "The object-instance can be 0 to %d.\r\n" "or:\r\n"
"The object-name can be any string of characters.\r\n", "The object-name can be any string of characters.\r\n",
BACNET_MAX_INSTANCE, (unsigned)apdu_timeout(), BACNET_MAX_INSTANCE, (unsigned) apdu_timeout(), BACNET_MAX_OBJECT,
BACNET_MAX_OBJECT, BACNET_MAX_INSTANCE); BACNET_MAX_INSTANCE);
} }
int main( int main(
@@ -144,32 +143,29 @@ int main(
time_t last_seconds = 0; time_t last_seconds = 0;
time_t current_seconds = 0; time_t current_seconds = 0;
time_t timeout_seconds = 0; time_t timeout_seconds = 0;
int argi = 0; int argi = 0;
bool by_name = false; bool by_name = false;
if (argc < 2) { if (argc < 2) {
print_usage(filename_remove_path(argv[0])); print_usage(filename_remove_path(argv[0]));
return 0; return 0;
} }
/* print help if requested */ /* print help if requested */
for (argi = 1; argi < argc; argi++) for (argi = 1; argi < argc; argi++) {
{ if (strcmp(argv[argi], "--help") == 0) {
if (strcmp(argv[argi], "--help") == 0) { print_help(filename_remove_path(argv[0]));
print_help(filename_remove_path(argv[0])); return 0;
return 0; }
} }
}
/* decode the command line parameters */ /* decode the command line parameters */
if (argc < 3) { if (argc < 3) {
/* bacwh "name" */ /* bacwh "name" */
Target_Object_Instance_Min = Target_Object_Instance_Min = Target_Object_Instance_Max = -1;
Target_Object_Instance_Max = -1;
Target_Object_Name = argv[1]; Target_Object_Name = argv[1];
by_name = true; by_name = true;
} else if (argc < 4) { } else if (argc < 4) {
/* bacwh 8 1234 */ /* bacwh 8 1234 */
Target_Object_Instance_Min = Target_Object_Instance_Min = Target_Object_Instance_Max = -1;
Target_Object_Instance_Max = -1;
Target_Object_Type = strtol(argv[1], NULL, 0); Target_Object_Type = strtol(argv[1], NULL, 0);
Target_Object_Instance = strtol(argv[2], NULL, 0); Target_Object_Instance = strtol(argv[2], NULL, 0);
} else if (argc < 5) { } else if (argc < 5) {
@@ -212,14 +208,12 @@ int main(
} }
} }
if (Target_Object_Instance_Min > BACNET_MAX_INSTANCE) { if (Target_Object_Instance_Min > BACNET_MAX_INSTANCE) {
fprintf(stderr, fprintf(stderr, "object-instance-min=%u - it must be less than %u\r\n",
"object-instance-min=%u - it must be less than %u\r\n",
Target_Object_Instance_Min, BACNET_MAX_INSTANCE + 1); Target_Object_Instance_Min, BACNET_MAX_INSTANCE + 1);
return 1; return 1;
} }
if (Target_Object_Instance_Max > BACNET_MAX_INSTANCE) { if (Target_Object_Instance_Max > BACNET_MAX_INSTANCE) {
fprintf(stderr, fprintf(stderr, "object-instance-max=%u - it must be less than %u\r\n",
"object-instance-max=%u - it must be less than %u\r\n",
Target_Object_Instance_Max, BACNET_MAX_INSTANCE + 1); Target_Object_Instance_Max, BACNET_MAX_INSTANCE + 1);
return 1; return 1;
} }
@@ -233,15 +227,11 @@ int main(
timeout_seconds = apdu_timeout() / 1000; timeout_seconds = apdu_timeout() / 1000;
/* send the request */ /* send the request */
if (by_name) { if (by_name) {
Send_WhoHas_Name( Send_WhoHas_Name(Target_Object_Instance_Min,
Target_Object_Instance_Min, Target_Object_Instance_Max, Target_Object_Name);
Target_Object_Instance_Max,
Target_Object_Name);
} else { } else {
Send_WhoHas_Object( Send_WhoHas_Object(Target_Object_Instance_Min,
Target_Object_Instance_Min, Target_Object_Instance_Max, Target_Object_Type,
Target_Object_Instance_Max,
Target_Object_Type,
Target_Object_Instance); Target_Object_Instance);
} }
/* loop forever */ /* loop forever */
+190 -218
View File
@@ -63,7 +63,7 @@ static bool Error_Detected = false;
#define BAC_ADDRESS_MULT 1 #define BAC_ADDRESS_MULT 1
struct address_entry { struct address_entry {
struct address_entry * next; struct address_entry *next;
uint8_t Flags; uint8_t Flags;
uint32_t device_id; uint32_t device_id;
unsigned max_apdu; unsigned max_apdu;
@@ -71,38 +71,41 @@ struct address_entry {
}; };
static struct address_table { static struct address_table {
struct address_entry * first; struct address_entry *first;
struct address_entry * last; struct address_entry *last;
} Address_Table = {0}; } Address_Table = {
0};
struct address_entry * alloc_address_entry(void) struct address_entry *alloc_address_entry(
void)
{ {
struct address_entry * rval; struct address_entry *rval;
rval = (struct address_entry *)calloc(1, sizeof(struct address_entry)); rval = (struct address_entry *) calloc(1, sizeof(struct address_entry));
if(Address_Table.first == 0) if (Address_Table.first == 0) {
{ Address_Table.first = Address_Table.last = rval;
Address_Table.first = Address_Table.last = rval; } else {
} Address_Table.last->next = rval;
else Address_Table.last = rval;
{ }
Address_Table.last->next = rval; return rval;
Address_Table.last = rval;
}
return rval;
} }
bool bacnet_address_matches(BACNET_ADDRESS * a1, BACNET_ADDRESS * a2) bool bacnet_address_matches(
BACNET_ADDRESS * a1,
BACNET_ADDRESS * a2)
{ {
int i = 0; int i = 0;
if(a1->net != a2->net) return false; if (a1->net != a2->net)
if(a1->len != a2->len) return false; return false;
for(;i<a1->len;i++) if (a1->len != a2->len)
if(a1->adr[i]!=a2->adr[i]) return false;
return false; for (; i < a1->len; i++)
return true; if (a1->adr[i] != a2->adr[i])
return false;
return true;
} }
void address_table_add( void address_table_add(
@@ -111,21 +114,20 @@ void address_table_add(
BACNET_ADDRESS * src) BACNET_ADDRESS * src)
{ {
struct address_entry *pMatch; struct address_entry *pMatch;
uint8_t flags = 0; uint8_t flags = 0;
pMatch = Address_Table.first; pMatch = Address_Table.first;
while (pMatch) { while (pMatch) {
if (pMatch->device_id == device_id) if (pMatch->device_id == device_id) {
{
if (bacnet_address_matches(&pMatch->address, src)) if (bacnet_address_matches(&pMatch->address, src))
return; return;
flags |= BAC_ADDRESS_MULT; flags |= BAC_ADDRESS_MULT;
pMatch->Flags |= BAC_ADDRESS_MULT; pMatch->Flags |= BAC_ADDRESS_MULT;
} }
pMatch = pMatch->next; pMatch = pMatch->next;
} }
pMatch = alloc_address_entry(); pMatch = alloc_address_entry();
pMatch->Flags = flags; pMatch->Flags = flags;
pMatch->device_id = device_id; pMatch->device_id = device_id;
@@ -219,124 +221,107 @@ static void init_service_handlers(
apdu_set_reject_handler(MyRejectHandler); apdu_set_reject_handler(MyRejectHandler);
} }
void print_macaddr(uint8_t * addr, int len) void print_macaddr(
uint8_t * addr,
int len)
{ {
int j = 0; int j = 0;
while(j < len) while (j < len) {
{ if (j != 0) {
if (j != 0) { printf(":");
printf(":"); }
} printf("%02X", addr[j]);
printf("%02X", addr[j]); j++;
j++; }
} while (j < MAX_MAC_LEN) {
while(j < MAX_MAC_LEN) printf(" ");
{ j++;
printf(" "); }
j++;
}
} }
static void print_address_cache( static void print_address_cache(
void) void)
{ {
BACNET_ADDRESS address; BACNET_ADDRESS address;
unsigned total_addresses = 0; unsigned total_addresses = 0;
unsigned dup_addresses = 0; unsigned dup_addresses = 0;
struct address_entry *addr; struct address_entry *addr;
uint8_t local_sadr = 0; uint8_t local_sadr = 0;
/* NOTE: this string format is parsed by src/address.c, /* NOTE: this string format is parsed by src/address.c,
so these must be compatible. */ so these must be compatible. */
printf(";%-7s %-20s %-5s %-20s %-4s\n", printf(";%-7s %-20s %-5s %-20s %-4s\n", "Device", "MAC (hex)", "SNET",
"Device", "MAC (hex)", "SNET", "SADR (hex)", "APDU"); "SADR (hex)", "APDU");
printf(";-------- -------------------- ----- -------------------- ----\n"); printf(";-------- -------------------- ----- -------------------- ----\n");
addr = Address_Table.first; addr = Address_Table.first;
while (addr) while (addr) {
{ bacnet_address_copy(&address, &addr->address);
bacnet_address_copy(&address, &addr->address); total_addresses++;
total_addresses++; if (addr->Flags & BAC_ADDRESS_MULT) {
if(addr->Flags & BAC_ADDRESS_MULT) dup_addresses++;
{ printf(";");
dup_addresses++; } else {
printf(";"); printf(" ");
} }
else printf(" %-7u ", addr->device_id);
{ print_macaddr(address.mac, address.mac_len);
printf(" "); printf(" %-5hu ", address.net);
} if (address.net) {
printf(" %-7u ", addr->device_id); print_macaddr(address.adr, address.len);
print_macaddr(address.mac, address.mac_len); } else {
printf(" %-5hu ", address.net); print_macaddr(&local_sadr, 1);
if (address.net) { }
print_macaddr(address.adr, address.len); printf(" %-4hu ", addr->max_apdu);
} else { printf("\n");
print_macaddr(&local_sadr, 1);
}
printf(" %-4hu ", addr->max_apdu);
printf("\n");
addr = addr->next; addr = addr->next;
} }
printf(";\n; Total Devices: %u\n", total_addresses); printf(";\n; Total Devices: %u\n", total_addresses);
if (dup_addresses) { if (dup_addresses) {
printf("; * Duplicate Devices: %u\n", dup_addresses); printf("; * Duplicate Devices: %u\n", dup_addresses);
} }
} }
static int print_usage(char* exe_name){ static int print_usage(
printf( char *exe_name)
"Usage:\n" {
"\n" printf("Usage:\n" "\n" "%s [[network]:[address]] "
"%s [[network]:[address]] " "[device-instance-min [device-instance-max]] [--help]\n", exe_name);
"[device-instance-min [device-instance-max]] [--help]\n" , return 1;
exe_name);
return 1;
} }
static int print_help(char* exe_name){ static int print_help(
printf( char *exe_name)
"Usage:\n" {
"\n" printf("Usage:\n" "\n" "%s [[network]:[address]] "
"%s [[network]:[address]] " "[device-instance-min [device-instance-max]] [--help]\n" "\n"
"[device-instance-min [device-instance-max]] [--help]\n" " Send BACnet WhoIs service request to a device or multiple devices, and wait\n"
"\n" " for responses. Displays any devices found and their network information.\n"
" Send BACnet WhoIs service request to a device or multiple devices, and wait\n" "\n" "device-instance:\r\n"
" for responses. Displays any devices found and their network information.\n" " BACnet Device Object Instance number that you are trying to send a Who-Is\n"
"\n" " service request. The value should be in the range of 0 to 4194303. A range\n"
"device-instance:\r\n" " of values can also be specified by using a minimum value and a maximum value.\n"
" BACnet Device Object Instance number that you are trying to send a Who-Is\n" "\n" "network:\n"
" service request. The value should be in the range of 0 to 4194303. A range\n" " BACnet network number for directed requests. Valid range is from 0 to 65535\n"
" of values can also be specified by using a minimum value and a maximum value.\n" " where 0 is the local connection and 65535 is network broadcast.\n"
"\n" "\n" "address:\n"
"network:\n" " BACnet mac address number. Valid ranges are from 0 to 255 or a IP connection \n"
" BACnet network number for directed requests. Valid range is from 0 to 65535\n" " string including port number like 10.1.2.3:47808.\n" "\n"
" where 0 is the local connection and 65535 is network broadcast.\n" "Examples:\n\n" "To send a WhoIs request to Network 123:\n"
"\n" "%s 123:\n\n" "To send a WhoIs request to Network 123 Address 5:\n"
"address:\n" "%s 123:5\n\n" "To send a WhoIs request to Device 123:\n" "%s 123\n\n"
" BACnet mac address number. Valid ranges are from 0 to 255 or a IP connection \n" "To send a WhoIs request to Devices from 1000 to 9000:\n"
" string including port number like 10.1.2.3:47808.\n" "%s 1000 9000\n\n"
"\n" "To send a WhoIs request to Devices from 1000 to 9000 on Network 123:\n"
"Examples:\n\n" "%s 123: 1000 9000\n\n" "To send a WhoIs request to all devices:\n"
"To send a WhoIs request to Network 123:\n" "%s\n\n", exe_name, exe_name, exe_name, exe_name, exe_name, exe_name,
"%s 123:\n\n" exe_name);
"To send a WhoIs request to Network 123 Address 5:\n" return 1;
"%s 123:5\n\n"
"To send a WhoIs request to Device 123:\n"
"%s 123\n\n"
"To send a WhoIs request to Devices from 1000 to 9000:\n"
"%s 1000 9000\n\n"
"To send a WhoIs request to Devices from 1000 to 9000 on Network 123:\n"
"%s 123: 1000 9000\n\n"
"To send a WhoIs request to all devices:\n"
"%s\n\n",
exe_name,exe_name,exe_name,exe_name,exe_name,exe_name,exe_name);
return 1;
} }
@@ -345,47 +330,39 @@ static int print_help(char* exe_name){
** @return length of address parsed in bytes ** @return length of address parsed in bytes
*/ */
static int parse_bac_address( static int parse_bac_address(
BACNET_ADDRESS *dest, /* [out] BACNET Address*/ BACNET_ADDRESS * dest, /* [out] BACNET Address */
char *src /* [in] nul terminated string to parse */ char *src /* [in] nul terminated string to parse */
) )
{ {
int i = 0; int i = 0;
uint16_t s; uint16_t s;
int a[4],p; int a[4], p;
int c = sscanf(src,"%u.%u.%u.%u:%u",&a[0],&a[1],&a[2],&a[3],&p); int c = sscanf(src, "%u.%u.%u.%u:%u", &a[0], &a[1], &a[2], &a[3], &p);
dest->len = 0; dest->len = 0;
if (c==1) if (c == 1) {
{ if (a[0] < 256) { /* mstp */
if( a[0] < 256 ) /* mstp */ dest->adr[0] = a[0];
{ dest->len = 1;
dest->adr[0] = a[0]; } else if (a[0] < 0x0FFFF) { /* lon */
dest->len = 1; s = htons((uint16_t) a[0]);
} memcpy(&dest->adr[0], &s, 2);
else if ( a[0] < 0x0FFFF ) /* lon */ dest->len = 2;
{ } else
s = htons((uint16_t)a[0]); return 0;
memcpy(&dest->adr[0], &s, 2); } else if (c == 5) { /* ip address */
dest->len = 2; for (i = 0; i < 4; i++) {
} if (a[i] == 0 || a[i] > 255)
else return 0;
return 0;
}
else if (c==5) /* ip address */
{
for(i=0;i<4;i++)
{
if(a[i] == 0 || a[i] > 255)
return 0;
dest->adr[i] = a[i]; dest->adr[i] = a[i];
} }
s = htons((uint16_t)p); s = htons((uint16_t) p);
memcpy(&dest->adr[i], &s, 2); memcpy(&dest->adr[i], &s, 2);
dest->len = 6; dest->len = 6;
} }
return dest->len; return dest->len;
} }
@@ -404,68 +381,62 @@ int main(
time_t last_seconds = 0; time_t last_seconds = 0;
time_t current_seconds = 0; time_t current_seconds = 0;
time_t timeout_seconds = 0; time_t timeout_seconds = 0;
BACNET_ADDRESS dest; BACNET_ADDRESS dest;
int argi; int argi;
/* print help if requested */ /* print help if requested */
for (argi = 1; argi < argc; argi++) for (argi = 1; argi < argc; argi++) {
{ if (strcmp(argv[argi], "--help") == 0) {
if (strcmp(argv[argi], "--help") == 0) { print_help(filename_remove_path(argv[0]));
print_help(filename_remove_path(argv[0])); return 0;
return 0; }
}
}
datalink_get_broadcast_address(&dest);
/* decode the command line parameters */
if (argc >= 2) {
char *s;
long v = strtol(argv[1], &s, 0);
if(*s++ == ':')
{
if(argv[1][0] != ':')
dest.net = (uint16_t) v;
dest.mac_len = 0;
if(isdigit(*s))
parse_bac_address(&dest,s);
}
else
{
Target_Object_Instance_Min = Target_Object_Instance_Max = v;
}
} }
if (argc <= 2){ datalink_get_broadcast_address(&dest);
/* empty */
} else if (argc == 3){ /* decode the command line parameters */
if(Target_Object_Instance_Min == -1) if (argc >= 2) {
Target_Object_Instance_Min = char *s;
Target_Object_Instance_Max = strtol(argv[2], NULL, 0); long v = strtol(argv[1], &s, 0);
else if (*s++ == ':') {
Target_Object_Instance_Max = strtol(argv[2], NULL, 0); if (argv[1][0] != ':')
} else if (argc == 4){ dest.net = (uint16_t) v;
dest.mac_len = 0;
if (isdigit(*s))
parse_bac_address(&dest, s);
} else {
Target_Object_Instance_Min = Target_Object_Instance_Max = v;
}
}
if (argc <= 2) {
/* empty */
} else if (argc == 3) {
if (Target_Object_Instance_Min == -1)
Target_Object_Instance_Min = Target_Object_Instance_Max =
strtol(argv[2], NULL, 0);
else
Target_Object_Instance_Max = strtol(argv[2], NULL, 0);
} else if (argc == 4) {
Target_Object_Instance_Min = strtol(argv[2], NULL, 0); Target_Object_Instance_Min = strtol(argv[2], NULL, 0);
Target_Object_Instance_Max = strtol(argv[3], NULL, 0); Target_Object_Instance_Max = strtol(argv[3], NULL, 0);
} else { } else {
print_usage(filename_remove_path(argv[0])); print_usage(filename_remove_path(argv[0]));
return 1; return 1;
} }
if (Target_Object_Instance_Min > BACNET_MAX_INSTANCE) { if (Target_Object_Instance_Min > BACNET_MAX_INSTANCE) {
fprintf(stderr, fprintf(stderr, "device-instance-min=%u - it must be less than %u\r\n",
"device-instance-min=%u - it must be less than %u\r\n",
Target_Object_Instance_Min, BACNET_MAX_INSTANCE + 1); Target_Object_Instance_Min, BACNET_MAX_INSTANCE + 1);
return 1; return 1;
} }
if (Target_Object_Instance_Max > BACNET_MAX_INSTANCE) { if (Target_Object_Instance_Max > BACNET_MAX_INSTANCE) {
fprintf(stderr, fprintf(stderr, "device-instance-max=%u - it must be less than %u\r\n",
"device-instance-max=%u - it must be less than %u\r\n",
Target_Object_Instance_Max, BACNET_MAX_INSTANCE + 1); Target_Object_Instance_Max, BACNET_MAX_INSTANCE + 1);
return 1; return 1;
} }
/* setup my info */ /* setup my info */
Device_Set_Object_Instance_Number(BACNET_MAX_INSTANCE); Device_Set_Object_Instance_Number(BACNET_MAX_INSTANCE);
init_service_handlers(); init_service_handlers();
address_init(); address_init();
@@ -475,8 +446,9 @@ int main(
last_seconds = time(NULL); last_seconds = time(NULL);
timeout_seconds = apdu_timeout() / 1000; timeout_seconds = apdu_timeout() / 1000;
/* send the request */ /* send the request */
Send_WhoIs_To_Network(&dest,Target_Object_Instance_Min, Target_Object_Instance_Max); Send_WhoIs_To_Network(&dest, Target_Object_Instance_Min,
/* loop forever */ Target_Object_Instance_Max);
/* loop forever */
for (;;) { for (;;) {
/* increment timer - exit if timed out */ /* increment timer - exit if timed out */
current_seconds = time(NULL); current_seconds = time(NULL);
+4 -3
View File
@@ -180,7 +180,8 @@ int main(
if (argc < 4) { if (argc < 4) {
/* FIXME: what about access method - record or stream? */ /* FIXME: what about access method - record or stream? */
printf("%s device-instance file-instance local-name [octet count] [pad value]\r\n", printf
("%s device-instance file-instance local-name [octet count] [pad value]\r\n",
filename_remove_path(argv[0])); filename_remove_path(argv[0]));
return 0; return 0;
} }
@@ -281,8 +282,8 @@ int main(
if (len < requestedOctetCount) { if (len < requestedOctetCount) {
End_Of_File_Detected = true; End_Of_File_Detected = true;
if (pad_byte) { if (pad_byte) {
memset(octetstring_value(&fileData)+len+1, memset(octetstring_value(&fileData) + len + 1,
(int)Target_File_Requested_Octet_Pad_Byte, (int) Target_File_Requested_Octet_Pad_Byte,
requestedOctetCount - len); requestedOctetCount - len);
len = requestedOctetCount; len = requestedOctetCount;
} }
+2 -1
View File
@@ -345,7 +345,8 @@ int main(
/* at least one second has passed */ /* at least one second has passed */
if (current_seconds != last_seconds) if (current_seconds != last_seconds)
tsm_timer_milliseconds((uint16_t)((current_seconds - last_seconds) * 1000)); tsm_timer_milliseconds((uint16_t) ((current_seconds -
last_seconds) * 1000));
if (Error_Detected) if (Error_Detected)
break; break;
/* wait until the device is bound, or timeout and quit */ /* wait until the device is bound, or timeout and quit */
+30 -30
View File
@@ -45,55 +45,55 @@
/* there are a few dependencies on the BACnet Protocol-Revision */ /* there are a few dependencies on the BACnet Protocol-Revision */
#if (BACNET_PROTOCOL_REVISION == 0) #if (BACNET_PROTOCOL_REVISION == 0)
#define MAX_ASHRAE_OBJECT_TYPE 18 #define MAX_ASHRAE_OBJECT_TYPE 18
#define MAX_BACNET_SERVICES_SUPPORTED 35 #define MAX_BACNET_SERVICES_SUPPORTED 35
#elif (BACNET_PROTOCOL_REVISION == 1) #elif (BACNET_PROTOCOL_REVISION == 1)
#define MAX_ASHRAE_OBJECT_TYPE 21 #define MAX_ASHRAE_OBJECT_TYPE 21
#define MAX_BACNET_SERVICES_SUPPORTED 37 #define MAX_BACNET_SERVICES_SUPPORTED 37
#elif (BACNET_PROTOCOL_REVISION == 2) #elif (BACNET_PROTOCOL_REVISION == 2)
/* from 135-2001 version of the BACnet Standard */ /* from 135-2001 version of the BACnet Standard */
#define MAX_ASHRAE_OBJECT_TYPE 23 #define MAX_ASHRAE_OBJECT_TYPE 23
#define MAX_BACNET_SERVICES_SUPPORTED 40 #define MAX_BACNET_SERVICES_SUPPORTED 40
#elif (BACNET_PROTOCOL_REVISION == 3) #elif (BACNET_PROTOCOL_REVISION == 3)
#define MAX_ASHRAE_OBJECT_TYPE 23 #define MAX_ASHRAE_OBJECT_TYPE 23
#define MAX_BACNET_SERVICES_SUPPORTED 40 #define MAX_BACNET_SERVICES_SUPPORTED 40
#elif (BACNET_PROTOCOL_REVISION == 4) #elif (BACNET_PROTOCOL_REVISION == 4)
/* from 135-2004 version of the BACnet Standard */ /* from 135-2004 version of the BACnet Standard */
#define MAX_ASHRAE_OBJECT_TYPE 25 #define MAX_ASHRAE_OBJECT_TYPE 25
#define MAX_BACNET_SERVICES_SUPPORTED 40 #define MAX_BACNET_SERVICES_SUPPORTED 40
#elif (BACNET_PROTOCOL_REVISION == 5) #elif (BACNET_PROTOCOL_REVISION == 5)
#define MAX_ASHRAE_OBJECT_TYPE 30 #define MAX_ASHRAE_OBJECT_TYPE 30
#define MAX_BACNET_SERVICES_SUPPORTED 40 #define MAX_BACNET_SERVICES_SUPPORTED 40
#elif (BACNET_PROTOCOL_REVISION == 6) #elif (BACNET_PROTOCOL_REVISION == 6)
#define MAX_ASHRAE_OBJECT_TYPE 31 #define MAX_ASHRAE_OBJECT_TYPE 31
#define MAX_BACNET_SERVICES_SUPPORTED 40 #define MAX_BACNET_SERVICES_SUPPORTED 40
#elif (BACNET_PROTOCOL_REVISION == 7) #elif (BACNET_PROTOCOL_REVISION == 7)
#define MAX_ASHRAE_OBJECT_TYPE 31 #define MAX_ASHRAE_OBJECT_TYPE 31
#define MAX_BACNET_SERVICES_SUPPORTED 40 #define MAX_BACNET_SERVICES_SUPPORTED 40
#elif (BACNET_PROTOCOL_REVISION == 8) #elif (BACNET_PROTOCOL_REVISION == 8)
#define MAX_ASHRAE_OBJECT_TYPE 31 #define MAX_ASHRAE_OBJECT_TYPE 31
#define MAX_BACNET_SERVICES_SUPPORTED 40 #define MAX_BACNET_SERVICES_SUPPORTED 40
#elif (BACNET_PROTOCOL_REVISION == 9) #elif (BACNET_PROTOCOL_REVISION == 9)
/* from 135-2008 version of the BACnet Standard */ /* from 135-2008 version of the BACnet Standard */
#define MAX_ASHRAE_OBJECT_TYPE 38 #define MAX_ASHRAE_OBJECT_TYPE 38
#define MAX_BACNET_SERVICES_SUPPORTED 40 #define MAX_BACNET_SERVICES_SUPPORTED 40
#elif (BACNET_PROTOCOL_REVISION == 10) #elif (BACNET_PROTOCOL_REVISION == 10)
#define MAX_ASHRAE_OBJECT_TYPE 51 #define MAX_ASHRAE_OBJECT_TYPE 51
#define MAX_BACNET_SERVICES_SUPPORTED 40 #define MAX_BACNET_SERVICES_SUPPORTED 40
#elif (BACNET_PROTOCOL_REVISION == 11) #elif (BACNET_PROTOCOL_REVISION == 11)
#define MAX_ASHRAE_OBJECT_TYPE 51 #define MAX_ASHRAE_OBJECT_TYPE 51
#define MAX_BACNET_SERVICES_SUPPORTED 40 #define MAX_BACNET_SERVICES_SUPPORTED 40
#elif (BACNET_PROTOCOL_REVISION == 12) #elif (BACNET_PROTOCOL_REVISION == 12)
/* from 135-2010 version of the BACnet Standard */ /* from 135-2010 version of the BACnet Standard */
#define MAX_ASHRAE_OBJECT_TYPE 51 #define MAX_ASHRAE_OBJECT_TYPE 51
#define MAX_BACNET_SERVICES_SUPPORTED 40 #define MAX_BACNET_SERVICES_SUPPORTED 40
#elif (BACNET_PROTOCOL_REVISION == 13) #elif (BACNET_PROTOCOL_REVISION == 13)
#define MAX_ASHRAE_OBJECT_TYPE 53 #define MAX_ASHRAE_OBJECT_TYPE 53
#define MAX_BACNET_SERVICES_SUPPORTED 40 #define MAX_BACNET_SERVICES_SUPPORTED 40
#elif (BACNET_PROTOCOL_REVISION == 14) #elif (BACNET_PROTOCOL_REVISION == 14)
/* from 135-2012 version of the BACnet Standard */ /* from 135-2012 version of the BACnet Standard */
#define MAX_ASHRAE_OBJECT_TYPE 55 #define MAX_ASHRAE_OBJECT_TYPE 55
#define MAX_BACNET_SERVICES_SUPPORTED 41 #define MAX_BACNET_SERVICES_SUPPORTED 41
#else #else
#error MAX_ASHRAE_OBJECT_TYPE and MAX_BACNET_SERVICES_SUPPORTED not defined! #error MAX_ASHRAE_OBJECT_TYPE and MAX_BACNET_SERVICES_SUPPORTED not defined!
#endif #endif
+6 -6
View File
@@ -409,12 +409,12 @@ typedef enum {
PROP_POWER = 384, PROP_POWER = 384,
PROP_TRANSITION = 385, PROP_TRANSITION = 385,
PROP_EGRESS_ACTIVE = 386 PROP_EGRESS_ACTIVE = 386
/* The special property identifiers all, optional, and required */ /* The special property identifiers all, optional, and required */
/* are reserved for use in the ReadPropertyConditional and */ /* are reserved for use in the ReadPropertyConditional and */
/* ReadPropertyMultiple services or services not defined in this standard. */ /* ReadPropertyMultiple services or services not defined in this standard. */
/* Enumerated values 0-511 are reserved for definition by ASHRAE. */ /* Enumerated values 0-511 are reserved for definition by ASHRAE. */
/* Enumerated values 512-4194303 may be used by others subject to the */ /* Enumerated values 512-4194303 may be used by others subject to the */
/* procedures and constraints described in Clause 23. */ /* procedures and constraints described in Clause 23. */
} BACNET_PROPERTY_ID; } BACNET_PROPERTY_ID;
/* do the MAX as define rather than enumeration for devices /* do the MAX as define rather than enumeration for devices
+1 -1
View File
@@ -31,7 +31,7 @@
#include "bacdef.h" #include "bacdef.h"
#include "npdu.h" #include "npdu.h"
struct sockaddr_in; /* Defined elsewhere, needed here. */ struct sockaddr_in; /* Defined elsewhere, needed here. */
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
+1 -1
View File
@@ -115,7 +115,7 @@ extern "C" {
/* returns the invoke ID for confirmed request, or 0 if failed */ /* returns the invoke ID for confirmed request, or 0 if failed */
uint8_t Send_Read_Property_Request_Address( uint8_t Send_Read_Property_Request_Address(
BACNET_ADDRESS *dest, BACNET_ADDRESS * dest,
uint16_t max_apdu, uint16_t max_apdu,
BACNET_OBJECT_TYPE object_type, BACNET_OBJECT_TYPE object_type,
uint32_t object_instance, uint32_t object_instance,
+1 -1
View File
@@ -135,7 +135,7 @@ extern "C" {
* chosen at runtime from among these choices. * chosen at runtime from among these choices.
* - Clause 10 POINT-TO-POINT (PTP) and Clause 11 EIA/CEA-709.1 ("LonTalk") LAN * - Clause 10 POINT-TO-POINT (PTP) and Clause 11 EIA/CEA-709.1 ("LonTalk") LAN
* are not currently supported by this project. * are not currently supported by this project.
*//** @defgroup DLTemplates DataLink Template Functions *//** @defgroup DLTemplates DataLink Template Functions
* @ingroup DataLink * @ingroup DataLink
* Most of the functions in this group are function templates which are assigned * Most of the functions in this group are function templates which are assigned
* to a specific DataLink network layer implementation either at compile time or * to a specific DataLink network layer implementation either at compile time or
+2 -2
View File
@@ -89,8 +89,8 @@ extern "C" {
uint8_t hundredths); uint8_t hundredths);
/* utility test for validity */ /* utility test for validity */
bool datetime_is_valid( bool datetime_is_valid(
BACNET_DATE *bdate, BACNET_DATE * bdate,
BACNET_TIME *btime); BACNET_TIME * btime);
/* utility comparison functions: /* utility comparison functions:
if the date/times are the same, return is 0 if the date/times are the same, return is 0
+2 -6
View File
@@ -94,9 +94,7 @@ extern "C" {
* *
* The network management BIBBs prescribe the BACnet capabilities required to * The network management BIBBs prescribe the BACnet capabilities required to
* interoperably perform network management functions. * interoperably perform network management functions.
*/ *//** @defgroup DMDCC Device Management-Device Communication Control (DM-DCC)
/** @defgroup DMDCC Device Management-Device Communication Control (DM-DCC)
* @ingroup RDMS * @ingroup RDMS
* 16.1 DeviceCommunicationControl Service <br> * 16.1 DeviceCommunicationControl Service <br>
* The DeviceCommunicationControl service is used by a client BACnet-user to * The DeviceCommunicationControl service is used by a client BACnet-user to
@@ -109,9 +107,7 @@ extern "C" {
* "indefinite," meaning communication must be re-enabled by a * "indefinite," meaning communication must be re-enabled by a
* DeviceCommunicationControl or, if supported, ReinitializeDevice service, * DeviceCommunicationControl or, if supported, ReinitializeDevice service,
* not by time. * not by time.
*/ *//** @defgroup NMRC Network Management-Router Configuration (NM-RC)
/** @defgroup NMRC Network Management-Router Configuration (NM-RC)
* @ingroup RDMS * @ingroup RDMS
* The A device may query and change the configuration of routers and * The A device may query and change the configuration of routers and
* half-routers. * half-routers.
+2 -6
View File
@@ -202,9 +202,7 @@ extern "C" {
* These BIBBs prescribe the BACnet capabilities required to interoperably * These BIBBs prescribe the BACnet capabilities required to interoperably
* perform the alarm and event management functions enumerated in 22.2.1.2 * perform the alarm and event management functions enumerated in 22.2.1.2
* for the BACnet devices defined therein. * for the BACnet devices defined therein.
*/ *//** @defgroup EVNOTFCN Alarm and Event-Notification (AE-N)
/** @defgroup EVNOTFCN Alarm and Event-Notification (AE-N)
* @ingroup ALMEVNT * @ingroup ALMEVNT
* 13.6 ConfirmedCOVNotification Service <br> * 13.6 ConfirmedCOVNotification Service <br>
* The ConfirmedCOVNotification service is used to notify subscribers about * The ConfirmedCOVNotification service is used to notify subscribers about
@@ -221,9 +219,7 @@ extern "C" {
* For unsubscribed notifications, the algorithm for determining when to issue * For unsubscribed notifications, the algorithm for determining when to issue
* this service is a local matter and may be based on a change of value, * this service is a local matter and may be based on a change of value,
* periodic updating, or some other criteria. * periodic updating, or some other criteria.
*/ *//** @defgroup ALMACK Alarm and Event-ACK (AE-ACK)
/** @defgroup ALMACK Alarm and Event-ACK (AE-ACK)
* @ingroup ALMEVNT * @ingroup ALMEVNT
* 13.5 AcknowledgeAlarm Service <br> * 13.5 AcknowledgeAlarm Service <br>
* In some systems a device may need to know that an operator has seen the alarm * In some systems a device may need to know that an operator has seen the alarm
+24 -12
View File
@@ -31,40 +31,52 @@ typedef struct fifo_buffer_t FIFO_BUFFER;
extern "C" { extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
unsigned FIFO_Count(FIFO_BUFFER const *b); unsigned FIFO_Count(
FIFO_BUFFER const *b);
bool FIFO_Full(FIFO_BUFFER const *b); bool FIFO_Full(
FIFO_BUFFER const *b);
bool FIFO_Available(FIFO_BUFFER const *b, bool FIFO_Available(
FIFO_BUFFER const *b,
unsigned count); unsigned count);
bool FIFO_Empty(FIFO_BUFFER const *b); bool FIFO_Empty(
FIFO_BUFFER const *b);
uint8_t FIFO_Peek(FIFO_BUFFER const *b); uint8_t FIFO_Peek(
FIFO_BUFFER const *b);
uint8_t FIFO_Get(FIFO_BUFFER * b); uint8_t FIFO_Get(
FIFO_BUFFER * b);
unsigned FIFO_Pull(FIFO_BUFFER * b, unsigned FIFO_Pull(
FIFO_BUFFER * b,
uint8_t * data_bytes, uint8_t * data_bytes,
unsigned length); unsigned length);
bool FIFO_Put(FIFO_BUFFER * b, bool FIFO_Put(
FIFO_BUFFER * b,
uint8_t data_byte); uint8_t data_byte);
bool FIFO_Add(FIFO_BUFFER * b, bool FIFO_Add(
FIFO_BUFFER * b,
uint8_t * data_bytes, uint8_t * data_bytes,
unsigned count); unsigned count);
void FIFO_Flush(FIFO_BUFFER * b); void FIFO_Flush(
FIFO_BUFFER * b);
/* note: buffer_len must be a power of two */ /* note: buffer_len must be a power of two */
void FIFO_Init(FIFO_BUFFER * b, void FIFO_Init(
FIFO_BUFFER * b,
volatile uint8_t * buffer, volatile uint8_t * buffer,
unsigned buffer_len); unsigned buffer_len);
#ifdef TEST #ifdef TEST
#include "ctest.h" #include "ctest.h"
void testFIFOBuffer(Test * pTest); void testFIFOBuffer(
Test * pTest);
#endif #endif
#ifdef __cplusplus #ifdef __cplusplus
+10 -7
View File
@@ -189,14 +189,17 @@ extern "C" {
int handler_timesync_encode_recipients( int handler_timesync_encode_recipients(
uint8_t * apdu, uint8_t * apdu,
int max_apdu); int max_apdu);
void handler_timesync_task(void); void handler_timesync_task(
void handler_timesync_init(void); void);
void handler_timesync_init(
void);
bool handler_timesync_recipient_write( bool handler_timesync_recipient_write(
BACNET_WRITE_PROPERTY_DATA * wp_data); BACNET_WRITE_PROPERTY_DATA * wp_data);
bool handler_timesync_interval_set(uint32_t minutes); bool handler_timesync_interval_set(
uint32_t minutes);
bool handler_timesync_recipient_address_set( bool handler_timesync_recipient_address_set(
unsigned index, unsigned index,
BACNET_ADDRESS *address); BACNET_ADDRESS * address);
void handler_read_property_multiple( void handler_read_property_multiple(
uint8_t * service_request, uint8_t * service_request,
@@ -313,10 +316,10 @@ extern "C" {
BACNET_CONFIRMED_SERVICE_DATA * service_data); BACNET_CONFIRMED_SERVICE_DATA * service_data);
void get_alarm_summary_ack_handler( void get_alarm_summary_ack_handler(
uint8_t *service_request, uint8_t * service_request,
uint16_t service_len, uint16_t service_len,
BACNET_ADDRESS *src, BACNET_ADDRESS * src,
BACNET_CONFIRMED_SERVICE_ACK_DATA *service_data); BACNET_CONFIRMED_SERVICE_ACK_DATA * service_data);
#ifdef __cplusplus #ifdef __cplusplus
+4 -4
View File
@@ -111,10 +111,10 @@ struct mstp_port_struct_t {
so that you can be atomic on 8 bit microcontrollers */ so that you can be atomic on 8 bit microcontrollers */
uint32_t( uint32_t(
*SilenceTimer) ( *SilenceTimer) (
void * pArg); void *pArg);
void ( void (
*SilenceTimerReset) ( *SilenceTimerReset) (
void * pArg); void *pArg);
/* A timer used to measure and generate Reply Postponed frames. It is */ /* A timer used to measure and generate Reply Postponed frames. It is */
/* incremented by a timer process and is cleared by the Master Node State */ /* incremented by a timer process and is cleared by the Master Node State */
@@ -164,8 +164,8 @@ struct mstp_port_struct_t {
uint8_t *OutputBuffer; uint8_t *OutputBuffer;
uint16_t OutputBufferSize; uint16_t OutputBufferSize;
/*Platform-specific port data*/ /*Platform-specific port data */
void * UserData; void *UserData;
}; };
+1 -3
View File
@@ -162,9 +162,7 @@ extern "C" {
* These BIBBs prescribe the BACnet capabilities required to interoperably * These BIBBs prescribe the BACnet capabilities required to interoperably
* perform the trending functions enumerated in clause 22.2.1.4 for the * perform the trending functions enumerated in clause 22.2.1.4 for the
* BACnet devices defined therein. * BACnet devices defined therein.
*/ *//** @defgroup TrendReadRange Trending -Read Range Service (eg, in T-VMT)
/** @defgroup TrendReadRange Trending -Read Range Service (eg, in T-VMT)
* @ingroup Trend * @ingroup Trend
* 15.8 ReadRange Service <br> * 15.8 ReadRange Service <br>
* The ReadRange service is used by a client BACnet-user to read a specific * The ReadRange service is used by a client BACnet-user to read a specific
+8 -8
View File
@@ -53,13 +53,13 @@ extern "C" {
RING_BUFFER const *b); RING_BUFFER const *b);
bool Ringbuf_Pop( bool Ringbuf_Pop(
RING_BUFFER * b, RING_BUFFER * b,
uint8_t *data_element); uint8_t * data_element);
bool Ringbuf_Put( bool Ringbuf_Put(
RING_BUFFER * b, /* ring buffer structure */ RING_BUFFER * b, /* ring buffer structure */
uint8_t *data_element); /* one element to add to the ring */ uint8_t * data_element); /* one element to add to the ring */
bool Ringbuf_Put_Front( bool Ringbuf_Put_Front(
RING_BUFFER * b, /* ring buffer structure */ RING_BUFFER * b, /* ring buffer structure */
uint8_t *data_element); uint8_t * data_element);
volatile uint8_t *Ringbuf_Alloc( volatile uint8_t *Ringbuf_Alloc(
RING_BUFFER * b); RING_BUFFER * b);
/* Note: element_count must be a power of two */ /* Note: element_count must be a power of two */
@@ -71,10 +71,10 @@ extern "C" {
#ifdef TEST #ifdef TEST
#include "ctest.h" #include "ctest.h"
void testRingBufSize16( void testRingBufSize16(
Test * pTest); Test * pTest);
void testRingBufSize32( void testRingBufSize32(
Test * pTest); Test * pTest);
#endif #endif
#ifdef __cplusplus #ifdef __cplusplus
+1 -3
View File
@@ -125,9 +125,7 @@ extern "C" {
* These BIBBs prescribe the BACnet capabilities required to interoperably * These BIBBs prescribe the BACnet capabilities required to interoperably
* perform the data sharing functions enumerated in 22.2.1.1 for the BACnet * perform the data sharing functions enumerated in 22.2.1.1 for the BACnet
* devices defined therein. * devices defined therein.
*/ *//** @defgroup DSRP Data Sharing -Read Property Service (DS-RP)
/** @defgroup DSRP Data Sharing -Read Property Service (DS-RP)
* @ingroup DataShare * @ingroup DataShare
* 15.5 ReadProperty Service <br> * 15.5 ReadProperty Service <br>
* The ReadProperty service is used by a client BACnet-user to request the * The ReadProperty service is used by a client BACnet-user to request the
+7 -7
View File
@@ -31,11 +31,11 @@
struct BACnet_Recipient_List; struct BACnet_Recipient_List;
typedef struct BACnet_Recipient_List { typedef struct BACnet_Recipient_List {
/* /*
BACnetRecipient ::= CHOICE { BACnetRecipient ::= CHOICE {
device [0] BACnetObjectIdentifier, device [0] BACnetObjectIdentifier,
address [1] BACnetAddress address [1] BACnetAddress
} }
*/ */
uint8_t tag; uint8_t tag;
union { union {
BACNET_OBJECT_ID device; BACNET_OBJECT_ID device;
@@ -83,11 +83,11 @@ extern "C" {
int timesync_encode_timesync_recipients( int timesync_encode_timesync_recipients(
uint8_t * apdu, uint8_t * apdu,
unsigned max_apdu, unsigned max_apdu,
BACNET_RECIPIENT_LIST *recipient); BACNET_RECIPIENT_LIST * recipient);
int timesync_decode_timesync_recipients( int timesync_decode_timesync_recipients(
uint8_t * apdu, uint8_t * apdu,
unsigned apdu_len, unsigned apdu_len,
BACNET_RECIPIENT_LIST *recipient); BACNET_RECIPIENT_LIST * recipient);
#ifdef TEST #ifdef TEST
#include "ctest.h" #include "ctest.h"
+2 -2
View File
@@ -367,8 +367,8 @@ bool Analog_Value_Write_Property(
(value.type.Real >= 0.0) && (value.type.Real <= 100.0)) { (value.type.Real >= 0.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
object_instance); (wp_data->object_instance);
priority--; priority--;
Present_Value[object_index] = level; Present_Value[object_index] = level;
/* Note: you could set the physical output here if we /* Note: you could set the physical output here if we
+2 -2
View File
@@ -278,8 +278,8 @@ bool Binary_Value_Write_Property(
(value.type.Enumerated <= MAX_BINARY_PV)) { (value.type.Enumerated <= MAX_BINARY_PV)) {
level = value.type.Enumerated; level = value.type.Enumerated;
object_index = object_index =
Binary_Value_Instance_To_Index(wp_data-> Binary_Value_Instance_To_Index
object_instance); (wp_data->object_instance);
priority--; priority--;
/* NOTE: this Binary value has no priority array */ /* NOTE: this Binary value has no priority array */
Present_Value[object_index] = level; Present_Value[object_index] = level;
+6 -6
View File
@@ -855,8 +855,8 @@ bool Device_Write_Property_Local(
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(value.type.Object_Id. (Device_Set_Object_Instance_Number(value.type.
instance))) { Object_Id.instance))) {
/* we could send an I-Am broadcast to let the world know */ /* we could send an I-Am broadcast to let the world know */
status = true; status = true;
} else { } else {
@@ -908,13 +908,13 @@ bool Device_Write_Property_Local(
characterstring_encoding(&value.type.Character_String); characterstring_encoding(&value.type.Character_String);
if (encoding < MAX_CHARACTER_STRING_ENCODING) { if (encoding < MAX_CHARACTER_STRING_ENCODING) {
/* All the object names in a device must be unique. */ /* All the object names in a device must be unique. */
if (Device_Valid_Object_Name(&value. if (Device_Valid_Object_Name(&value.type.
type.Character_String, NULL, NULL)) { Character_String, NULL, NULL)) {
wp_data->error_class = ERROR_CLASS_PROPERTY; wp_data->error_class = ERROR_CLASS_PROPERTY;
wp_data->error_code = ERROR_CODE_DUPLICATE_NAME; wp_data->error_code = ERROR_CODE_DUPLICATE_NAME;
} else { } else {
Device_Set_Object_Name(&value. Device_Set_Object_Name(&value.type.
type.Character_String); Character_String);
status = true; status = true;
} }
} else { } else {
+1 -1
View File
@@ -303,7 +303,7 @@ static void Timer0IrqHandler(
{ {
volatile AT91PS_TC pTC = AT91C_BASE_TC0; /* pointer to timer channel 0 register structure */ volatile AT91PS_TC pTC = AT91C_BASE_TC0; /* pointer to timer channel 0 register structure */
volatile unsigned int dummy; /* temporary */ volatile unsigned int dummy; /* temporary */
/* read TC0 Status Register to clear interrupt */ /* read TC0 Status Register to clear interrupt */
dummy = pTC->TC_SR; dummy = pTC->TC_SR;
+2 -2
View File
@@ -218,8 +218,8 @@ bool Binary_Value_Write_Property(
if ((value.type.Enumerated == BINARY_ACTIVE) || if ((value.type.Enumerated == BINARY_ACTIVE) ||
(value.type.Enumerated == BINARY_INACTIVE)) { (value.type.Enumerated == BINARY_INACTIVE)) {
object_index = object_index =
Binary_Value_Instance_To_Index(wp_data-> Binary_Value_Instance_To_Index
object_instance); (wp_data->object_instance);
/* NOTE: this Binary value has no priority array */ /* NOTE: this Binary value has no priority array */
Present_Value[object_index] = Present_Value[object_index] =
(BACNET_BINARY_PV) value.type.Enumerated; (BACNET_BINARY_PV) value.type.Enumerated;
+2 -2
View File
@@ -386,8 +386,8 @@ bool Device_Write_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(value.type.Object_Id. (Device_Set_Object_Instance_Number(value.type.
instance))) { Object_Id.instance))) {
/* we could send an I-Am broadcast to let the world know */ /* we could send an I-Am broadcast to let the world know */
status = true; status = true;
} else { } else {
+2 -2
View File
@@ -211,8 +211,8 @@ bool Binary_Value_Write_Property(
if ((value.type.Enumerated == BINARY_ACTIVE) || if ((value.type.Enumerated == BINARY_ACTIVE) ||
(value.type.Enumerated == BINARY_INACTIVE)) { (value.type.Enumerated == BINARY_INACTIVE)) {
object_index = object_index =
Binary_Value_Instance_To_Index(wp_data-> Binary_Value_Instance_To_Index
object_instance); (wp_data->object_instance);
/* NOTE: this Binary value has no priority array */ /* NOTE: this Binary value has no priority array */
Present_Value[object_index] = Present_Value[object_index] =
(BACNET_BINARY_PV) value.type.Enumerated; (BACNET_BINARY_PV) value.type.Enumerated;
+2 -4
View File
@@ -169,13 +169,11 @@ int Analog_Input_Read_Property(
case PROP_OBJECT_NAME: case PROP_OBJECT_NAME:
Analog_Input_Object_Name(rpdata->object_instance, &char_string); Analog_Input_Object_Name(rpdata->object_instance, &char_string);
apdu_len = apdu_len =
encode_application_character_string(&apdu[0], encode_application_character_string(&apdu[0], &char_string);
&char_string);
break; break;
case PROP_OBJECT_TYPE: case PROP_OBJECT_TYPE:
apdu_len = apdu_len =
encode_application_enumerated(&apdu[0], encode_application_enumerated(&apdu[0], rpdata->object_type);
rpdata->object_type);
break; break;
case PROP_PRESENT_VALUE: case PROP_PRESENT_VALUE:
apdu_len = apdu_len =
+2 -4
View File
@@ -221,13 +221,11 @@ int Analog_Value_Read_Property(
case PROP_OBJECT_NAME: case PROP_OBJECT_NAME:
Analog_Value_Object_Name(rpdata->object_instance, &char_string); Analog_Value_Object_Name(rpdata->object_instance, &char_string);
apdu_len = apdu_len =
encode_application_character_string(&apdu[0], encode_application_character_string(&apdu[0], &char_string);
&char_string);
break; break;
case PROP_OBJECT_TYPE: case PROP_OBJECT_TYPE:
apdu_len = apdu_len =
encode_application_enumerated(&apdu[0], encode_application_enumerated(&apdu[0], rpdata->object_type);
rpdata->object_type);
break; break;
case PROP_PRESENT_VALUE: case PROP_PRESENT_VALUE:
real_value = Analog_Value_Present_Value(rpdata->object_instance); real_value = Analog_Value_Present_Value(rpdata->object_instance);
+2 -1
View File
@@ -65,7 +65,8 @@ static bool seeprom_version_test(
rv = seeprom_bytes_read(NV_SEEPROM_TYPE_0, (uint8_t *) & id, 2); rv = seeprom_bytes_read(NV_SEEPROM_TYPE_0, (uint8_t *) & id, 2);
if (rv > 0) { if (rv > 0) {
rv = seeprom_bytes_read(NV_SEEPROM_VERSION_0, (uint8_t *) & version, 2); rv = seeprom_bytes_read(NV_SEEPROM_VERSION_0, (uint8_t *) & version,
2);
} }
if ((rv > 0) && (id == SEEPROM_ID) && (version == SEEPROM_VERSION)) { if ((rv > 0) && (id == SEEPROM_ID) && (version == SEEPROM_VERSION)) {
+4 -6
View File
@@ -178,10 +178,10 @@ int Binary_Input_Read_Property(
BACNET_READ_PROPERTY_DATA * rpdata) BACNET_READ_PROPERTY_DATA * rpdata)
{ {
int apdu_len = 0; /* return value */ int apdu_len = 0; /* return value */
BACNET_BIT_STRING bit_string = {0}; BACNET_BIT_STRING bit_string = { 0 };
BACNET_POLARITY polarity = POLARITY_NORMAL; BACNET_POLARITY polarity = POLARITY_NORMAL;
BACNET_BINARY_PV value = BINARY_INACTIVE; BACNET_BINARY_PV value = BINARY_INACTIVE;
BACNET_CHARACTER_STRING char_string = {0}; BACNET_CHARACTER_STRING char_string = { 0 };
uint8_t *apdu = NULL; uint8_t *apdu = NULL;
if ((rpdata->application_data == NULL) || if ((rpdata->application_data == NULL) ||
@@ -198,13 +198,11 @@ int Binary_Input_Read_Property(
case PROP_OBJECT_NAME: case PROP_OBJECT_NAME:
Binary_Input_Object_Name(rpdata->object_instance, &char_string); Binary_Input_Object_Name(rpdata->object_instance, &char_string);
apdu_len = apdu_len =
encode_application_character_string(&apdu[0], encode_application_character_string(&apdu[0], &char_string);
&char_string);
break; break;
case PROP_OBJECT_TYPE: case PROP_OBJECT_TYPE:
apdu_len = apdu_len =
encode_application_enumerated(&apdu[0], encode_application_enumerated(&apdu[0], rpdata->object_type);
rpdata->object_type);
break; break;
case PROP_PRESENT_VALUE: case PROP_PRESENT_VALUE:
value = Binary_Input_Present_Value(rpdata->object_instance); value = Binary_Input_Present_Value(rpdata->object_instance);
+6 -8
View File
@@ -250,8 +250,8 @@ int Binary_Output_Read_Property(
{ {
int len = 0; int len = 0;
int apdu_len = 0; /* return value */ int apdu_len = 0; /* return value */
BACNET_BIT_STRING bit_string = {0}; BACNET_BIT_STRING bit_string = { 0 };
BACNET_CHARACTER_STRING char_string = {0}; BACNET_CHARACTER_STRING char_string = { 0 };
BACNET_BINARY_PV present_value = BINARY_INACTIVE; BACNET_BINARY_PV present_value = BINARY_INACTIVE;
unsigned object_index = 0; unsigned object_index = 0;
unsigned i = 0; unsigned i = 0;
@@ -272,13 +272,11 @@ int Binary_Output_Read_Property(
case PROP_OBJECT_NAME: case PROP_OBJECT_NAME:
Binary_Output_Object_Name(rpdata->object_instance, &char_string); Binary_Output_Object_Name(rpdata->object_instance, &char_string);
apdu_len = apdu_len =
encode_application_character_string(&apdu[0], encode_application_character_string(&apdu[0], &char_string);
&char_string);
break; break;
case PROP_OBJECT_TYPE: case PROP_OBJECT_TYPE:
apdu_len = apdu_len =
encode_application_enumerated(&apdu[0], encode_application_enumerated(&apdu[0], rpdata->object_type);
rpdata->object_type);
break; break;
case PROP_PRESENT_VALUE: case PROP_PRESENT_VALUE:
present_value = present_value =
@@ -461,8 +459,8 @@ bool Binary_Output_Write_Property(
priority = wp_data->priority; priority = wp_data->priority;
if (priority && (priority <= BACNET_MAX_PRIORITY)) { if (priority && (priority <= BACNET_MAX_PRIORITY)) {
priority--; priority--;
Binary_Output_Present_Value_Set(wp_data-> Binary_Output_Present_Value_Set
object_instance, level, priority); (wp_data->object_instance, level, priority);
} else if (priority == 6) { } else if (priority == 6) {
status = false; status = false;
/* Command priority 6 is reserved for use by Minimum On/Off /* Command priority 6 is reserved for use by Minimum On/Off
@@ -11,11 +11,11 @@
#if (__GNUC__ <= 4) && (__GNUC_MINOR__ < 3) #if (__GNUC__ <= 4) && (__GNUC_MINOR__ < 3)
#if !defined(EEWE) && defined(EEPE) #if !defined(EEWE) && defined(EEPE)
# define EEWE EEPE #define EEWE EEPE
#endif #endif
#if !defined(EEMWE) && defined(EEMPE) #if !defined(EEMWE) && defined(EEMPE)
# define EEMWE EEMPE #define EEMWE EEMPE
#endif #endif
#endif #endif
@@ -20,55 +20,55 @@
#if defined(__ICCAVR__) #if defined(__ICCAVR__)
/* IAR Embedded Workbench */ /* IAR Embedded Workbench */
# include <inavr.h> #include <inavr.h>
# define _GET_LOCK_BITS() __AddrToZByteToSPMCR_LPM( (void __flash *) 0x0001, 0x09 ) #define _GET_LOCK_BITS() __AddrToZByteToSPMCR_LPM( (void __flash *) 0x0001, 0x09 )
# define _GET_LOW_FUSES() __AddrToZByteToSPMCR_LPM( (void __flash *) 0x0000, 0x09 ) #define _GET_LOW_FUSES() __AddrToZByteToSPMCR_LPM( (void __flash *) 0x0000, 0x09 )
# define _GET_HIGH_FUSES() __AddrToZByteToSPMCR_LPM( (void __flash *) 0x0003, 0x09 ) #define _GET_HIGH_FUSES() __AddrToZByteToSPMCR_LPM( (void __flash *) 0x0003, 0x09 )
# define _GET_EXTENDED_FUSES() __AddrToZByteToSPMCR_LPM( (void __flash *) 0x0002, 0x09 ) #define _GET_EXTENDED_FUSES() __AddrToZByteToSPMCR_LPM( (void __flash *) 0x0002, 0x09 )
# define _SET_LOCK_BITS(data) __DataToR0ByteToSPMCR_SPM( data, 0x09 ) #define _SET_LOCK_BITS(data) __DataToR0ByteToSPMCR_SPM( data, 0x09 )
# define _ENABLE_RWW_SECTION() __DataToR0ByteToSPMCR_SPM( 0x00, 0x11 ) #define _ENABLE_RWW_SECTION() __DataToR0ByteToSPMCR_SPM( 0x00, 0x11 )
# define _WAIT_FOR_SPM() while( SPMCR_REG & (1<<SPMEN) ); #define _WAIT_FOR_SPM() while( SPMCR_REG & (1<<SPMEN) );
# ifndef LARGE_MEMORY #ifndef LARGE_MEMORY
# define _LOAD_PROGRAM_MEMORY(addr) __load_program_memory( (const unsigned char __flash *) (addr) ) #define _LOAD_PROGRAM_MEMORY(addr) __load_program_memory( (const unsigned char __flash *) (addr) )
# define _FILL_TEMP_WORD(addr,data) __AddrToZWordToR1R0ByteToSPMCR_SPM( (void __flash *) (addr), data, 0x01 ) #define _FILL_TEMP_WORD(addr,data) __AddrToZWordToR1R0ByteToSPMCR_SPM( (void __flash *) (addr), data, 0x01 )
# define _PAGE_ERASE(addr) __AddrToZByteToSPMCR_SPM( (void __flash *) (addr), 0x03 ) #define _PAGE_ERASE(addr) __AddrToZByteToSPMCR_SPM( (void __flash *) (addr), 0x03 )
# define _PAGE_WRITE(addr) __AddrToZByteToSPMCR_SPM( (void __flash *) (addr), 0x05 ) #define _PAGE_WRITE(addr) __AddrToZByteToSPMCR_SPM( (void __flash *) (addr), 0x05 )
# else /* LARGE_MEMORY */ #else /* LARGE_MEMORY */
# define _LOAD_PROGRAM_MEMORY(addr) __extended_load_program_memory( (const unsigned char __farflash *) (addr) ) #define _LOAD_PROGRAM_MEMORY(addr) __extended_load_program_memory( (const unsigned char __farflash *) (addr) )
# define _FILL_TEMP_WORD(addr,data) __AddrToZ24WordToR1R0ByteToSPMCR_SPM( (void __farflash *) (addr), data, 0x01 ) #define _FILL_TEMP_WORD(addr,data) __AddrToZ24WordToR1R0ByteToSPMCR_SPM( (void __farflash *) (addr), data, 0x01 )
# define _PAGE_ERASE(addr) __AddrToZ24ByteToSPMCR_SPM( (void __farflash *) (addr), 0x03 ) #define _PAGE_ERASE(addr) __AddrToZ24ByteToSPMCR_SPM( (void __farflash *) (addr), 0x03 )
# define _PAGE_WRITE(addr) __AddrToZ24ByteToSPMCR_SPM( (void __farflash *) (addr), 0x05 ) #define _PAGE_WRITE(addr) __AddrToZ24ByteToSPMCR_SPM( (void __farflash *) (addr), 0x05 )
# endif /* LARGE_MEMORY */ #endif /* LARGE_MEMORY */
#elif __GNUC__ > 0 #elif __GNUC__ > 0
/* AVR-GCC/avr-libc */ /* AVR-GCC/avr-libc */
# include <avr/boot.h> #include <avr/boot.h>
# include <avr/pgmspace.h> #include <avr/pgmspace.h>
# if defined(GET_LOCK_BITS) /* avr-libc >= 1.2.5 */ #if defined(GET_LOCK_BITS) /* avr-libc >= 1.2.5 */
# define _GET_LOCK_BITS() boot_lock_fuse_bits_get(GET_LOCK_BITS) #define _GET_LOCK_BITS() boot_lock_fuse_bits_get(GET_LOCK_BITS)
# define _GET_LOW_FUSES() boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS) #define _GET_LOW_FUSES() boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS)
# define _GET_HIGH_FUSES() boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS) #define _GET_HIGH_FUSES() boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS)
# define _GET_EXTENDED_FUSES() boot_lock_fuse_bits_get(GET_EXTENDED_FUSE_BITS) #define _GET_EXTENDED_FUSES() boot_lock_fuse_bits_get(GET_EXTENDED_FUSE_BITS)
# endif /* defined(GET_LOCK_BITS) */ #endif /* defined(GET_LOCK_BITS) */
# define _SET_LOCK_BITS(data) boot_lock_bits_set(~data) #define _SET_LOCK_BITS(data) boot_lock_bits_set(~data)
# define _ENABLE_RWW_SECTION() boot_rww_enable() #define _ENABLE_RWW_SECTION() boot_rww_enable()
# define _WAIT_FOR_SPM() boot_spm_busy_wait() #define _WAIT_FOR_SPM() boot_spm_busy_wait()
# ifndef LARGE_MEMORY #ifndef LARGE_MEMORY
# define _LOAD_PROGRAM_MEMORY(addr) pgm_read_byte_near(addr) #define _LOAD_PROGRAM_MEMORY(addr) pgm_read_byte_near(addr)
# else /* LARGE_MEMORY */ #else /* LARGE_MEMORY */
# define _LOAD_PROGRAM_MEMORY(addr) pgm_read_byte_far(addr) #define _LOAD_PROGRAM_MEMORY(addr) pgm_read_byte_far(addr)
# endif /* LARGE_MEMORY */ #endif /* LARGE_MEMORY */
# define _FILL_TEMP_WORD(addr,data) boot_page_fill(addr, data) #define _FILL_TEMP_WORD(addr,data) boot_page_fill(addr, data)
# define _PAGE_ERASE(addr) boot_page_erase(addr) #define _PAGE_ERASE(addr) boot_page_erase(addr)
# define _PAGE_WRITE(addr) boot_page_write(addr) #define _PAGE_WRITE(addr) boot_page_write(addr)
#else #else
# error "Don't know your compiler." #error "Don't know your compiler."
#endif #endif
@@ -46,9 +46,9 @@
* smaller devices. * smaller devices.
*/ */
#ifdef LARGE_MEMORY #ifdef LARGE_MEMORY
# define ADDR_T unsigned long #define ADDR_T unsigned long
#else /* !LARGE_MEMORY */ #else /* !LARGE_MEMORY */
# define ADDR_T unsigned int #define ADDR_T unsigned int
#endif /* LARGE_MEMORY */ #endif /* LARGE_MEMORY */
#ifndef REMOVE_BLOCK_SUPPORT #ifndef REMOVE_BLOCK_SUPPORT
+10 -14
View File
@@ -561,8 +561,8 @@ int Device_Read_Property_Local(
{ {
int apdu_len = 0; /* return value */ int apdu_len = 0; /* return value */
int len = 0; /* apdu len intermediate value */ int len = 0; /* apdu len intermediate value */
BACNET_BIT_STRING bit_string = {0}; BACNET_BIT_STRING bit_string = { 0 };
BACNET_CHARACTER_STRING char_string = {0}; BACNET_CHARACTER_STRING char_string = { 0 };
unsigned i = 0; unsigned i = 0;
int object_type = 0; int object_type = 0;
uint32_t instance = 0; uint32_t instance = 0;
@@ -575,7 +575,7 @@ int Device_Read_Property_Local(
return 0; return 0;
} }
apdu = rpdata->application_data; apdu = rpdata->application_data;
switch ((int)rpdata->object_property) { switch ((int) rpdata->object_property) {
case PROP_OBJECT_IDENTIFIER: case PROP_OBJECT_IDENTIFIER:
apdu_len = apdu_len =
encode_application_object_id(&apdu[0], rpdata->object_type, encode_application_object_id(&apdu[0], rpdata->object_type,
@@ -584,13 +584,11 @@ int Device_Read_Property_Local(
case PROP_OBJECT_NAME: case PROP_OBJECT_NAME:
Device_Object_Name(rpdata->object_instance, &char_string); Device_Object_Name(rpdata->object_instance, &char_string);
apdu_len = apdu_len =
encode_application_character_string(&apdu[0], encode_application_character_string(&apdu[0], &char_string);
&char_string);
break; break;
case PROP_OBJECT_TYPE: case PROP_OBJECT_TYPE:
apdu_len = apdu_len =
encode_application_enumerated(&apdu[0], encode_application_enumerated(&apdu[0], rpdata->object_type);
rpdata->object_type);
break; break;
case PROP_DESCRIPTION: case PROP_DESCRIPTION:
bacnet_name(NV_EEPROM_DEVICE_DESCRIPTION, &char_string, bacnet_name(NV_EEPROM_DEVICE_DESCRIPTION, &char_string,
@@ -801,12 +799,12 @@ bool Device_Write_Property_Local(
wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY;
return false; return false;
} }
switch ((int)wp_data->object_property) { switch ((int) 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(value.type.Object_Id. (Device_Set_Object_Instance_Number(value.type.
instance))) { Object_Id.instance))) {
eeprom_bytes_write(NV_EEPROM_DEVICE_0, eeprom_bytes_write(NV_EEPROM_DEVICE_0,
(uint8_t *) & value.type.Object_Id.instance, 4); (uint8_t *) & value.type.Object_Id.instance, 4);
/* we could send an I-Am broadcast to let the world know */ /* we could send an I-Am broadcast to let the world know */
@@ -855,10 +853,8 @@ bool Device_Write_Property_Local(
if (value.tag == BACNET_APPLICATION_TAG_CHARACTER_STRING) { if (value.tag == BACNET_APPLICATION_TAG_CHARACTER_STRING) {
status = status =
bacnet_name_write_unique(NV_EEPROM_DEVICE_NAME, bacnet_name_write_unique(NV_EEPROM_DEVICE_NAME,
wp_data->object_type, wp_data->object_type, wp_data->object_instance,
wp_data->object_instance, &value.type.Character_String, &wp_data->error_class,
&value.type.Character_String,
&wp_data->error_class,
&wp_data->error_code); &wp_data->error_code);
} else { } else {
wp_data->error_class = ERROR_CLASS_PROPERTY; wp_data->error_class = ERROR_CLASS_PROPERTY;
+7 -6
View File
@@ -1129,8 +1129,8 @@ static bool MSTP_Master_Node_FSM(
if (pkt != NULL) { if (pkt != NULL) {
matched = matched =
dlmstp_compare_data_expecting_reply(&InputBuffer[0], dlmstp_compare_data_expecting_reply(&InputBuffer[0],
DataLength, SourceAddress, &pkt->buffer[0], pkt->length, DataLength, SourceAddress, &pkt->buffer[0],
pkt->destination_mac); pkt->length, pkt->destination_mac);
} else { } else {
matched = false; matched = false;
} }
@@ -1146,10 +1146,12 @@ static bool MSTP_Master_Node_FSM(
if (pkt->data_expecting_reply) { if (pkt->data_expecting_reply) {
frame_type = FRAME_TYPE_BACNET_DATA_EXPECTING_REPLY; frame_type = FRAME_TYPE_BACNET_DATA_EXPECTING_REPLY;
} else { } else {
frame_type = FRAME_TYPE_BACNET_DATA_NOT_EXPECTING_REPLY; frame_type =
FRAME_TYPE_BACNET_DATA_NOT_EXPECTING_REPLY;
} }
MSTP_Send_Frame(frame_type, pkt->destination_mac, This_Station, MSTP_Send_Frame(frame_type, pkt->destination_mac,
(uint8_t *) & pkt->buffer[0], pkt->length); This_Station, (uint8_t *) & pkt->buffer[0],
pkt->length);
Master_State = MSTP_MASTER_STATE_IDLE; Master_State = MSTP_MASTER_STATE_IDLE;
/* clear our flag we were holding for comparison */ /* clear our flag we were holding for comparison */
MSTP_Flag.ReceivedValidFrame = false; MSTP_Flag.ReceivedValidFrame = false;
@@ -1354,4 +1356,3 @@ void dlmstp_get_broadcast_address(
return; return;
} }
+5 -5
View File
@@ -330,12 +330,12 @@ unsigned char __uint8_eeprom_load(
#define power_timer2_enable() (PRR0 &= (uint8_t)~(1 << PRTIM2)) #define power_timer2_enable() (PRR0 &= (uint8_t)~(1 << PRTIM2))
#endif #endif
#if (defined(__GNUC__) && ((__GNUC__ == 4) && (__GNUC_MINOR__ < 5))) #if (defined(__GNUC__) && ((__GNUC__ == 4) && (__GNUC_MINOR__ < 5)))
#if defined(__AVR_ATmega644P__) #if defined(__AVR_ATmega644P__)
/* bug in WinAVR - fixed in later versions */ /* bug in WinAVR - fixed in later versions */
#define power_usart1_enable() (PRR &= (uint8_t)~(1 << PRUSART1)) #define power_usart1_enable() (PRR &= (uint8_t)~(1 << PRUSART1))
#elif defined(__AVR_ATmega1284P__) #elif defined(__AVR_ATmega1284P__)
#define power_usart1_enable() (PRR0 &= (uint8_t)~(1 << PRUSART1)) #define power_usart1_enable() (PRR0 &= (uint8_t)~(1 << PRUSART1))
#endif #endif
#endif #endif
#if defined(__CROSSWORKS_AVR) #if defined(__CROSSWORKS_AVR)
+34 -35
View File
@@ -43,14 +43,13 @@
bool BIP_Debug = true; bool BIP_Debug = true;
void * void *get_addr_ptr(
get_addr_ptr (struct sockaddr * sockaddr_ptr) struct sockaddr *sockaddr_ptr)
{ {
void * addr_ptr; void *addr_ptr;
if (sockaddr_ptr->sa_family == AF_INET) { if (sockaddr_ptr->sa_family == AF_INET) {
addr_ptr = &((struct sockaddr_in *) sockaddr_ptr)->sin_addr; addr_ptr = &((struct sockaddr_in *) sockaddr_ptr)->sin_addr;
} } else if (sockaddr_ptr->sa_family == AF_INET6) {
else if (sockaddr_ptr->sa_family == AF_INET6) {
addr_ptr = &((struct sockaddr_in6 *) sockaddr_ptr)->sin6_addr; addr_ptr = &((struct sockaddr_in6 *) sockaddr_ptr)->sin6_addr;
} }
return addr_ptr; return addr_ptr;
@@ -81,41 +80,41 @@ long bip_getaddrbyname(
* @param request [in] addr broadaddr netmask * @param request [in] addr broadaddr netmask
*/ */
static int get_local_address( static int get_local_address(
char *ifname,struct in_addr *addr,char *request) char *ifname,
struct in_addr *addr,
char *request)
{ {
char rv; /* return value */ char rv; /* return value */
struct ifaddrs * ifaddrs_ptr; struct ifaddrs *ifaddrs_ptr;
int status; int status;
status = getifaddrs (& ifaddrs_ptr); status = getifaddrs(&ifaddrs_ptr);
if (status == -1) { if (status == -1) {
fprintf (stderr, "Error in 'getifaddrs': %d (%s)\n", fprintf(stderr, "Error in 'getifaddrs': %d (%s)\n", errno,
errno, strerror (errno)); strerror(errno));
} }
while (ifaddrs_ptr) { while (ifaddrs_ptr) {
if ((ifaddrs_ptr->ifa_addr->sa_family == AF_INET) && if ((ifaddrs_ptr->ifa_addr->sa_family == AF_INET) &&
(strcmp(ifaddrs_ptr->ifa_name, ifname) == 0)) { (strcmp(ifaddrs_ptr->ifa_name, ifname) == 0)) {
void * addr_ptr; void *addr_ptr;
if (! ifaddrs_ptr->ifa_addr) { if (!ifaddrs_ptr->ifa_addr) {
return rv; return rv;
}
if (strcmp(request, "addr") == 0) {
addr_ptr = get_addr_ptr (ifaddrs_ptr->ifa_addr);
}
else if (strcmp(request, "broadaddr") == 0) {
addr_ptr = get_addr_ptr (ifaddrs_ptr->ifa_broadaddr);
}
else if (strcmp(request, "netmask") == 0) {
addr_ptr = get_addr_ptr (ifaddrs_ptr->ifa_netmask);
}
if (addr_ptr) {
memcpy(addr, addr_ptr, sizeof(struct in_addr));
}
} }
ifaddrs_ptr = ifaddrs_ptr->ifa_next; if (strcmp(request, "addr") == 0) {
addr_ptr = get_addr_ptr(ifaddrs_ptr->ifa_addr);
} else if (strcmp(request, "broadaddr") == 0) {
addr_ptr = get_addr_ptr(ifaddrs_ptr->ifa_broadaddr);
} else if (strcmp(request, "netmask") == 0) {
addr_ptr = get_addr_ptr(ifaddrs_ptr->ifa_netmask);
}
if (addr_ptr) {
memcpy(addr, addr_ptr, sizeof(struct in_addr));
}
}
ifaddrs_ptr = ifaddrs_ptr->ifa_next;
} }
freeifaddrs (ifaddrs_ptr); freeifaddrs(ifaddrs_ptr);
return rv; return rv;
} }
@@ -185,7 +184,7 @@ bool bip_init(
if (ifname) { if (ifname) {
bip_set_interface(ifname); bip_set_interface(ifname);
printf("interface %s", ifname); printf("interface %s", ifname);
} else { } else {
bip_set_interface("en0"); bip_set_interface("en0");
} }
@@ -258,9 +257,9 @@ int bip_get_local_netmask(
char *ifname = getenv("BACNET_IFACE"); /* will probably be null */ char *ifname = getenv("BACNET_IFACE"); /* will probably be null */
if (ifname == NULL) if (ifname == NULL)
ifname = "en0"; ifname = "en0";
printf("ifname %s",ifname); printf("ifname %s", ifname);
char *request = "netmask"; char *request = "netmask";
rv = get_local_address(ifname, netmask, request); rv = get_local_address(ifname, netmask, request);
return rv; return rv;
} }
+6 -6
View File
@@ -46,28 +46,28 @@
#include <sys/un.h> /* for Unix domain sockets */ #include <sys/un.h> /* for Unix domain sockets */
#ifdef HAVE_SYS_SELECT_H #ifdef HAVE_SYS_SELECT_H
# include <sys/select.h> /* for convenience */ #include <sys/select.h> /* for convenience */
#endif #endif
#ifdef HAVE_POLL_H #ifdef HAVE_POLL_H
# include <poll.h> /* for convenience */ #include <poll.h> /* for convenience */
#endif #endif
#ifdef HAVE_STRINGS_H #ifdef HAVE_STRINGS_H
# include <strings.h> /* for convenience */ #include <strings.h> /* for convenience */
#endif #endif
/* Three headers are normally needed for socket/file ioctl's: /* Three headers are normally needed for socket/file ioctl's:
* <sys/ioctl.h>, <sys/filio.h>, and <sys/sockio.h>. * <sys/ioctl.h>, <sys/filio.h>, and <sys/sockio.h>.
*/ */
#ifdef HAVE_SYS_IOCTL_H #ifdef HAVE_SYS_IOCTL_H
# include <sys/ioctl.h> #include <sys/ioctl.h>
#endif #endif
#ifdef HAVE_SYS_FILIO_H #ifdef HAVE_SYS_FILIO_H
# include <sys/filio.h> #include <sys/filio.h>
#endif #endif
#ifdef HAVE_SYS_SOCKIO_H #ifdef HAVE_SYS_SOCKIO_H
# include <sys/sockio.h> #include <sys/sockio.h>
#endif #endif
#include <pthread.h> #include <pthread.h>
+2 -2
View File
@@ -100,7 +100,7 @@ static uint8_t Tusage_timeout = 60;
static struct timeval start; static struct timeval start;
static uint32_t Timer_Silence( static uint32_t Timer_Silence(
void * pArg) void *pArg)
{ {
struct timeval now, tmp_diff; struct timeval now, tmp_diff;
int32_t res; int32_t res;
@@ -113,7 +113,7 @@ static uint32_t Timer_Silence(
} }
static void Timer_Silence_Reset( static void Timer_Silence_Reset(
void * pArg) void *pArg)
{ {
gettimeofday(&start, NULL); gettimeofday(&start, NULL);
} }
+294 -297
View File
@@ -49,46 +49,44 @@
#define INCREMENT_AND_LIMIT_UINT16(x) {if (x < 0xFFFF) x++;} #define INCREMENT_AND_LIMIT_UINT16(x) {if (x < 0xFFFF) x++;}
uint32_t Timer_Silence( uint32_t Timer_Silence(
void * poPort) void *poPort)
{ {
struct timeval now, tmp_diff; struct timeval now, tmp_diff;
SHARED_MSTP_DATA * poSharedData; SHARED_MSTP_DATA *poSharedData;
struct mstp_port_struct_t * mstp_port = (struct mstp_port_struct_t *) poPort; struct mstp_port_struct_t *mstp_port =
if(!mstp_port) (struct mstp_port_struct_t *) poPort;
{ if (!mstp_port) {
return -1; return -1;
} }
poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData; poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData;
if(!poSharedData) if (!poSharedData) {
{ return -1;
return -1; }
}
int32_t res; int32_t res;
gettimeofday(&now, NULL); gettimeofday(&now, NULL);
timersub(&poSharedData->start, &now, &tmp_diff); timersub(&poSharedData->start, &now, &tmp_diff);
res = ((tmp_diff.tv_sec) * 1000 + (tmp_diff.tv_usec) / 1000); res = ((tmp_diff.tv_sec) * 1000 + (tmp_diff.tv_usec) / 1000);
return (res >= 0 ? res : -res); return (res >= 0 ? res : -res);
} }
void Timer_Silence_Reset( void Timer_Silence_Reset(
void * poPort) void *poPort)
{ {
SHARED_MSTP_DATA * poSharedData; SHARED_MSTP_DATA *poSharedData;
struct mstp_port_struct_t * mstp_port = (struct mstp_port_struct_t *) poPort; struct mstp_port_struct_t *mstp_port =
if(!mstp_port) (struct mstp_port_struct_t *) poPort;
{ if (!mstp_port) {
return; return;
} }
poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData; poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData;
if(!poSharedData) if (!poSharedData) {
{ return;
return; }
}
gettimeofday(&poSharedData->start, NULL); gettimeofday(&poSharedData->start, NULL);
} }
void get_abstime( void get_abstime(
@@ -106,22 +104,22 @@ void get_abstime(
} }
void dlmstp_cleanup( void dlmstp_cleanup(
void * poPort) void *poPort)
{ {
SHARED_MSTP_DATA * poSharedData; SHARED_MSTP_DATA *poSharedData;
struct mstp_port_struct_t * mstp_port = (struct mstp_port_struct_t *) poPort; struct mstp_port_struct_t *mstp_port =
if(!mstp_port) (struct mstp_port_struct_t *) poPort;
{ if (!mstp_port) {
return; return;
} }
poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData; poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData;
if(!poSharedData) if (!poSharedData) {
{ return;
return; }
}
/* restore the old port settings */ /* restore the old port settings */
tcsetattr(poSharedData->RS485_Handle, TCSANOW, &poSharedData->RS485_oldtio); tcsetattr(poSharedData->RS485_Handle, TCSANOW,
&poSharedData->RS485_oldtio);
close(poSharedData->RS485_Handle); close(poSharedData->RS485_Handle);
pthread_cond_destroy(&poSharedData->Received_Frame_Flag); pthread_cond_destroy(&poSharedData->Received_Frame_Flag);
@@ -134,7 +132,7 @@ void dlmstp_cleanup(
/* returns number of bytes sent on success, zero on failure */ /* returns number of bytes sent on success, zero on failure */
int dlmstp_send_pdu( int dlmstp_send_pdu(
void * poPort, void *poPort,
BACNET_ADDRESS * dest, /* destination address */ BACNET_ADDRESS * dest, /* destination address */
uint8_t * pdu, /* any data to be sent - may be null */ uint8_t * pdu, /* any data to be sent - may be null */
unsigned pdu_len) unsigned pdu_len)
@@ -142,34 +140,34 @@ int dlmstp_send_pdu(
int bytes_sent = 0; int bytes_sent = 0;
struct mstp_pdu_packet *pkt; struct mstp_pdu_packet *pkt;
unsigned i = 0; unsigned i = 0;
SHARED_MSTP_DATA * poSharedData; SHARED_MSTP_DATA *poSharedData;
struct mstp_port_struct_t * mstp_port = (struct mstp_port_struct_t *) poPort; struct mstp_port_struct_t *mstp_port =
if(!mstp_port) (struct mstp_port_struct_t *) poPort;
{ if (!mstp_port) {
return 0; return 0;
} }
poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData; poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData;
if(!poSharedData) if (!poSharedData) {
{ return 0;
return 0; }
}
pkt = (struct mstp_pdu_packet *) Ringbuf_Alloc(&poSharedData->PDU_Queue); pkt = (struct mstp_pdu_packet *) Ringbuf_Alloc(&poSharedData->PDU_Queue);
if (pkt) { if (pkt) {
pkt->data_expecting_reply = BACNET_DATA_EXPECTING_REPLY(pdu[BACNET_PDU_CONTROL_BYTE_OFFSET]); pkt->data_expecting_reply =
for (i = 0; i < pdu_len; i++) { BACNET_DATA_EXPECTING_REPLY(pdu[BACNET_PDU_CONTROL_BYTE_OFFSET]);
pkt->buffer[i] = pdu[i]; for (i = 0; i < pdu_len; i++) {
} pkt->buffer[i] = pdu[i];
pkt->length = pdu_len; }
pkt->destination_mac = dest->mac[0]; pkt->length = pdu_len;
bytes_sent = pdu_len; pkt->destination_mac = dest->mac[0];
} bytes_sent = pdu_len;
}
return bytes_sent; return bytes_sent;
} }
uint16_t dlmstp_receive( uint16_t dlmstp_receive(
void * poPort, void *poPort,
BACNET_ADDRESS * src, /* source address */ BACNET_ADDRESS * src, /* source address */
uint8_t * pdu, /* PDU data */ uint8_t * pdu, /* PDU data */
uint16_t max_pdu, /* amount of space available in the PDU */ uint16_t max_pdu, /* amount of space available in the PDU */
@@ -178,60 +176,58 @@ uint16_t dlmstp_receive(
uint16_t pdu_len = 0; uint16_t pdu_len = 0;
struct timespec abstime; struct timespec abstime;
int rv = 0; int rv = 0;
SHARED_MSTP_DATA * poSharedData; SHARED_MSTP_DATA *poSharedData;
struct mstp_port_struct_t * mstp_port = (struct mstp_port_struct_t *) poPort; struct mstp_port_struct_t *mstp_port =
if(!mstp_port) (struct mstp_port_struct_t *) poPort;
{ if (!mstp_port) {
return 0; return 0;
} }
poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData; poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData;
if(!poSharedData) if (!poSharedData) {
{ return 0;
return 0; }
}
(void) max_pdu; (void) max_pdu;
/* 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 */
get_abstime(&abstime, timeout); get_abstime(&abstime, timeout);
rv = pthread_cond_timedwait(&poSharedData->Receive_Packet_Flag, &poSharedData->Receive_Packet_Mutex, rv = pthread_cond_timedwait(&poSharedData->Receive_Packet_Flag,
&abstime); &poSharedData->Receive_Packet_Mutex, &abstime);
if (rv == 0) { if (rv == 0) {
if (poSharedData->Receive_Packet.ready) { if (poSharedData->Receive_Packet.ready) {
if (poSharedData->Receive_Packet.pdu_len) { if (poSharedData->Receive_Packet.pdu_len) {
poSharedData->MSTP_Packets++; poSharedData->MSTP_Packets++;
if (src) { if (src) {
memmove(src, &poSharedData->Receive_Packet.address, memmove(src, &poSharedData->Receive_Packet.address,
sizeof(poSharedData->Receive_Packet.address)); sizeof(poSharedData->Receive_Packet.address));
}
if (pdu) {
memmove(pdu, &poSharedData->Receive_Packet.pdu,
sizeof(poSharedData->Receive_Packet.pdu));
}
pdu_len = poSharedData->Receive_Packet.pdu_len;
} }
poSharedData->Receive_Packet.ready = false; if (pdu) {
memmove(pdu, &poSharedData->Receive_Packet.pdu,
sizeof(poSharedData->Receive_Packet.pdu));
}
pdu_len = poSharedData->Receive_Packet.pdu_len;
} }
poSharedData->Receive_Packet.ready = false;
} }
}
return pdu_len; return pdu_len;
} }
void *dlmstp_receive_fsm_task( void *dlmstp_receive_fsm_task(
void *pArg) void *pArg)
{ {
bool received_frame; bool received_frame;
SHARED_MSTP_DATA * poSharedData; SHARED_MSTP_DATA *poSharedData;
struct mstp_port_struct_t * mstp_port = (struct mstp_port_struct_t*)pArg; struct mstp_port_struct_t *mstp_port = (struct mstp_port_struct_t *) pArg;
if(!mstp_port) if (!mstp_port) {
{ return NULL;
return NULL;
} }
poSharedData = (SHARED_MSTP_DATA *) ((struct mstp_port_struct_t*)pArg)->UserData; poSharedData =
if(!poSharedData) (SHARED_MSTP_DATA *) ((struct mstp_port_struct_t *) pArg)->UserData;
{ if (!poSharedData) {
return NULL; return NULL;
} }
for (;;) { for (;;) {
/* only do receive state machine while we don't have a frame */ /* only do receive state machine while we don't have a frame */
@@ -239,9 +235,10 @@ void *dlmstp_receive_fsm_task(
(mstp_port->ReceivedInvalidFrame == false)) { (mstp_port->ReceivedInvalidFrame == false)) {
do { do {
RS485_Check_UART_Data(mstp_port); RS485_Check_UART_Data(mstp_port);
MSTP_Receive_Frame_FSM((volatile struct mstp_port_struct_t*)pArg); MSTP_Receive_Frame_FSM((volatile struct mstp_port_struct_t *)
pArg);
received_frame = mstp_port->ReceivedValidFrame || received_frame = mstp_port->ReceivedValidFrame ||
mstp_port->ReceivedInvalidFrame; mstp_port->ReceivedInvalidFrame;
if (received_frame) { if (received_frame) {
pthread_cond_signal(&poSharedData->Received_Frame_Flag); pthread_cond_signal(&poSharedData->Received_Frame_Flag);
break; break;
@@ -256,61 +253,60 @@ void *dlmstp_receive_fsm_task(
void *dlmstp_master_fsm_task( void *dlmstp_master_fsm_task(
void *pArg) void *pArg)
{ {
uint32_t silence = 0; uint32_t silence = 0;
bool run_master = false; bool run_master = false;
SHARED_MSTP_DATA * poSharedData; SHARED_MSTP_DATA *poSharedData;
struct mstp_port_struct_t * mstp_port = (struct mstp_port_struct_t*)pArg; struct mstp_port_struct_t *mstp_port = (struct mstp_port_struct_t *) pArg;
if(!mstp_port) if (!mstp_port) {
{ return NULL;
return NULL;
} }
poSharedData = (SHARED_MSTP_DATA *) ((struct mstp_port_struct_t*)pArg)->UserData; poSharedData =
if(!poSharedData) (SHARED_MSTP_DATA *) ((struct mstp_port_struct_t *) pArg)->UserData;
{ if (!poSharedData) {
return NULL; return NULL;
} }
for (;;) { for (;;) {
if (mstp_port->ReceivedValidFrame == false && if (mstp_port->ReceivedValidFrame == false &&
mstp_port->ReceivedInvalidFrame == false) { mstp_port->ReceivedInvalidFrame == false) {
RS485_Check_UART_Data(mstp_port); RS485_Check_UART_Data(mstp_port);
MSTP_Receive_Frame_FSM(mstp_port); MSTP_Receive_Frame_FSM(mstp_port);
} }
if (mstp_port->ReceivedValidFrame || mstp_port->ReceivedInvalidFrame) { if (mstp_port->ReceivedValidFrame || mstp_port->ReceivedInvalidFrame) {
run_master = true; run_master = true;
} else { } else {
silence = mstp_port->SilenceTimer(NULL); silence = mstp_port->SilenceTimer(NULL);
switch (mstp_port->master_state) { switch (mstp_port->master_state) {
case MSTP_MASTER_STATE_IDLE: case MSTP_MASTER_STATE_IDLE:
if (silence >= Tno_token) if (silence >= Tno_token)
run_master = true; run_master = true;
break; break;
case MSTP_MASTER_STATE_WAIT_FOR_REPLY: case MSTP_MASTER_STATE_WAIT_FOR_REPLY:
if (silence >= poSharedData->Treply_timeout) if (silence >= poSharedData->Treply_timeout)
run_master = true; run_master = true;
break; break;
case MSTP_MASTER_STATE_POLL_FOR_MASTER: case MSTP_MASTER_STATE_POLL_FOR_MASTER:
if (silence >= poSharedData->Tusage_timeout) if (silence >= poSharedData->Tusage_timeout)
run_master = true; run_master = true;
break; break;
default: default:
run_master = true; run_master = true;
break; break;
} }
} }
if (run_master) { if (run_master) {
if (mstp_port->This_Station <= DEFAULT_MAX_MASTER) { if (mstp_port->This_Station <= DEFAULT_MAX_MASTER) {
while (MSTP_Master_Node_FSM(mstp_port)) { while (MSTP_Master_Node_FSM(mstp_port)) {
/* do nothing while immediate transitioning */ /* do nothing while immediate transitioning */
} }
} else if (mstp_port->This_Station < 255) { } else if (mstp_port->This_Station < 255) {
MSTP_Slave_Node_FSM(mstp_port); MSTP_Slave_Node_FSM(mstp_port);
} }
} }
} }
return NULL; return NULL;
} }
void dlmstp_fill_bacnet_address( void dlmstp_fill_bacnet_address(
@@ -343,12 +339,11 @@ uint16_t MSTP_Put_Receive(
volatile struct mstp_port_struct_t *mstp_port) volatile struct mstp_port_struct_t *mstp_port)
{ {
uint16_t pdu_len = 0; uint16_t pdu_len = 0;
SHARED_MSTP_DATA * poSharedData = (SHARED_MSTP_DATA*)mstp_port->UserData; SHARED_MSTP_DATA *poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData;
if(!poSharedData) if (!poSharedData) {
{ return 0;
return 0; }
}
if (!poSharedData->Receive_Packet.ready) { if (!poSharedData->Receive_Packet.ready) {
/* bounds check - maybe this should send an abort? */ /* bounds check - maybe this should send an abort? */
@@ -373,42 +368,41 @@ uint16_t MSTP_Get_Send(
volatile struct mstp_port_struct_t * mstp_port, volatile struct mstp_port_struct_t * mstp_port,
unsigned timeout) unsigned timeout)
{ /* milliseconds to wait for a packet */ { /* milliseconds to wait for a packet */
uint16_t pdu_len = 0; uint16_t pdu_len = 0;
uint8_t frame_type = 0; uint8_t frame_type = 0;
struct mstp_pdu_packet *pkt; struct mstp_pdu_packet *pkt;
SHARED_MSTP_DATA * poSharedData = (SHARED_MSTP_DATA*)mstp_port->UserData; SHARED_MSTP_DATA *poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData;
if(!poSharedData) if (!poSharedData) {
{ return 0;
return 0; }
}
(void) timeout; (void) timeout;
if (Ringbuf_Empty(&poSharedData->PDU_Queue)) { if (Ringbuf_Empty(&poSharedData->PDU_Queue)) {
return 0; return 0;
} }
pkt = (struct mstp_pdu_packet *) Ringbuf_Peek(&poSharedData->PDU_Queue); pkt = (struct mstp_pdu_packet *) Ringbuf_Peek(&poSharedData->PDU_Queue);
if (pkt->data_expecting_reply) { if (pkt->data_expecting_reply) {
frame_type = FRAME_TYPE_BACNET_DATA_EXPECTING_REPLY; frame_type = FRAME_TYPE_BACNET_DATA_EXPECTING_REPLY;
} else { } else {
frame_type = FRAME_TYPE_BACNET_DATA_NOT_EXPECTING_REPLY; frame_type = FRAME_TYPE_BACNET_DATA_NOT_EXPECTING_REPLY;
} }
/* convert the PDU into the MSTP Frame */ /* convert the PDU into the MSTP Frame */
pdu_len = MSTP_Create_Frame(&mstp_port->OutputBuffer[0], /* <-- loading this */ pdu_len = MSTP_Create_Frame(&mstp_port->OutputBuffer[0], /* <-- loading this */
mstp_port->OutputBufferSize, frame_type, pkt->destination_mac, mstp_port->OutputBufferSize, frame_type, pkt->destination_mac,
mstp_port->This_Station, (uint8_t *) & pkt->buffer[0], pkt->length); mstp_port->This_Station, (uint8_t *) & pkt->buffer[0], pkt->length);
(void) Ringbuf_Pop(&poSharedData->PDU_Queue, NULL); (void) Ringbuf_Pop(&poSharedData->PDU_Queue, NULL);
return pdu_len; return pdu_len;
} }
bool dlmstp_compare_data_expecting_reply( bool dlmstp_compare_data_expecting_reply(
uint8_t * request_pdu, uint8_t * request_pdu,
uint16_t request_pdu_len, uint16_t request_pdu_len,
uint8_t src_address, uint8_t src_address,
uint8_t * reply_pdu, uint8_t * reply_pdu,
uint16_t reply_pdu_len, uint16_t reply_pdu_len,
uint8_t dest_address) uint8_t dest_address)
{ {
uint16_t offset; uint16_t offset;
/* One way to check the message is to compare NPDU /* One way to check the message is to compare NPDU
@@ -565,12 +559,11 @@ uint16_t MSTP_Get_Reply(
bool matched = false; bool matched = false;
uint8_t frame_type = 0; uint8_t frame_type = 0;
struct mstp_pdu_packet *pkt; struct mstp_pdu_packet *pkt;
SHARED_MSTP_DATA * poSharedData = (SHARED_MSTP_DATA*)mstp_port->UserData; SHARED_MSTP_DATA *poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData;
if(!poSharedData) if (!poSharedData) {
{ return 0;
return 0; }
}
if (Ringbuf_Empty(&poSharedData->PDU_Queue)) { if (Ringbuf_Empty(&poSharedData->PDU_Queue)) {
return 0; return 0;
@@ -599,15 +592,15 @@ uint16_t MSTP_Get_Reply(
} }
void dlmstp_set_mac_address( void dlmstp_set_mac_address(
void * poPort, void *poPort,
uint8_t mac_address) uint8_t mac_address)
{ {
/* SHARED_MSTP_DATA * poSharedData; */ /* SHARED_MSTP_DATA * poSharedData; */
struct mstp_port_struct_t * mstp_port = (struct mstp_port_struct_t *) poPort; struct mstp_port_struct_t *mstp_port =
if(!mstp_port) (struct mstp_port_struct_t *) poPort;
{ if (!mstp_port) {
return; return;
} }
/* /*
poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData; poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData;
if(!poSharedData) if(!poSharedData)
@@ -617,7 +610,7 @@ void dlmstp_set_mac_address(
*/ */
/* Master Nodes can only have address 0-127 */ /* Master Nodes can only have address 0-127 */
if (mac_address <= 127) { if (mac_address <= 127) {
mstp_port->This_Station = mac_address; mstp_port->This_Station = mac_address;
/* FIXME: implement your data storage */ /* FIXME: implement your data storage */
/* I2C_Write_Byte( /* I2C_Write_Byte(
EEPROM_DEVICE_ADDRESS, EEPROM_DEVICE_ADDRESS,
@@ -631,14 +624,14 @@ void dlmstp_set_mac_address(
} }
uint8_t dlmstp_mac_address( uint8_t dlmstp_mac_address(
void * poPort) void *poPort)
{ {
/* SHARED_MSTP_DATA * poSharedData; */ /* SHARED_MSTP_DATA * poSharedData; */
struct mstp_port_struct_t * mstp_port = (struct mstp_port_struct_t *) poPort; struct mstp_port_struct_t *mstp_port =
if(!mstp_port) (struct mstp_port_struct_t *) poPort;
{ if (!mstp_port) {
return 0; return 0;
} }
/* poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData; /* poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData;
if(!poSharedData) if(!poSharedData)
{ {
@@ -657,15 +650,15 @@ uint8_t dlmstp_mac_address(
/* bandwidth to particular nodes. If Max_Info_Frames is not writable in a */ /* bandwidth to particular nodes. If Max_Info_Frames is not writable in a */
/* node, its value shall be 1. */ /* node, its value shall be 1. */
void dlmstp_set_max_info_frames( void dlmstp_set_max_info_frames(
void * poPort, void *poPort,
uint8_t max_info_frames) uint8_t max_info_frames)
{ {
/* SHARED_MSTP_DATA * poSharedData; */ /* SHARED_MSTP_DATA * poSharedData; */
struct mstp_port_struct_t * mstp_port = (struct mstp_port_struct_t *) poPort; struct mstp_port_struct_t *mstp_port =
if(!mstp_port) (struct mstp_port_struct_t *) poPort;
{ if (!mstp_port) {
return; return;
} }
/* /*
poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData; poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData;
if(!poSharedData) if(!poSharedData)
@@ -674,7 +667,7 @@ void dlmstp_set_max_info_frames(
} }
*/ */
if (max_info_frames >= 1) { if (max_info_frames >= 1) {
mstp_port->Nmax_info_frames = max_info_frames; mstp_port->Nmax_info_frames = max_info_frames;
/* FIXME: implement your data storage */ /* FIXME: implement your data storage */
/* I2C_Write_Byte( /* I2C_Write_Byte(
EEPROM_DEVICE_ADDRESS, EEPROM_DEVICE_ADDRESS,
@@ -686,14 +679,14 @@ void dlmstp_set_max_info_frames(
} }
uint8_t dlmstp_max_info_frames( uint8_t dlmstp_max_info_frames(
void * poPort) void *poPort)
{ {
/* SHARED_MSTP_DATA * poSharedData; */ /* SHARED_MSTP_DATA * poSharedData; */
struct mstp_port_struct_t * mstp_port = (struct mstp_port_struct_t *) poPort; struct mstp_port_struct_t *mstp_port =
if(!mstp_port) (struct mstp_port_struct_t *) poPort;
{ if (!mstp_port) {
return 0; return 0;
} }
/* /*
poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData; poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData;
if(!poSharedData) if(!poSharedData)
@@ -710,15 +703,15 @@ uint8_t dlmstp_max_info_frames(
/* less than or equal to 127. If Max_Master is not writable in a node, */ /* less than or equal to 127. If Max_Master is not writable in a node, */
/* its value shall be 127. */ /* its value shall be 127. */
void dlmstp_set_max_master( void dlmstp_set_max_master(
void * poPort, void *poPort,
uint8_t max_master) uint8_t max_master)
{ {
/* SHARED_MSTP_DATA * poSharedData; */ /* SHARED_MSTP_DATA * poSharedData; */
struct mstp_port_struct_t * mstp_port = (struct mstp_port_struct_t *) poPort; struct mstp_port_struct_t *mstp_port =
if(!mstp_port) (struct mstp_port_struct_t *) poPort;
{ if (!mstp_port) {
return; return;
} }
/* /*
poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData; poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData;
if(!poSharedData) if(!poSharedData)
@@ -728,7 +721,7 @@ void dlmstp_set_max_master(
*/ */
if (max_master <= 127) { if (max_master <= 127) {
if (mstp_port->This_Station <= max_master) { if (mstp_port->This_Station <= max_master) {
mstp_port->Nmax_master = max_master; mstp_port->Nmax_master = max_master;
/* FIXME: implement your data storage */ /* FIXME: implement your data storage */
/* I2C_Write_Byte( /* I2C_Write_Byte(
EEPROM_DEVICE_ADDRESS, EEPROM_DEVICE_ADDRESS,
@@ -741,14 +734,14 @@ void dlmstp_set_max_master(
} }
uint8_t dlmstp_max_master( uint8_t dlmstp_max_master(
void * poPort) void *poPort)
{ {
/* SHARED_MSTP_DATA * poSharedData; */ /* SHARED_MSTP_DATA * poSharedData; */
struct mstp_port_struct_t * mstp_port = (struct mstp_port_struct_t *) poPort; struct mstp_port_struct_t *mstp_port =
if(!mstp_port) (struct mstp_port_struct_t *) poPort;
{ if (!mstp_port) {
return 0; return 0;
} }
/* /*
poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData; poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData;
if(!poSharedData) if(!poSharedData)
@@ -761,36 +754,35 @@ uint8_t dlmstp_max_master(
/* RS485 Baud Rate 9600, 19200, 38400, 57600, 115200 */ /* RS485 Baud Rate 9600, 19200, 38400, 57600, 115200 */
void dlmstp_set_baud_rate( void dlmstp_set_baud_rate(
void * poPort, void *poPort,
uint32_t baud) uint32_t baud)
{ {
SHARED_MSTP_DATA * poSharedData; SHARED_MSTP_DATA *poSharedData;
struct mstp_port_struct_t * mstp_port = (struct mstp_port_struct_t *) poPort; struct mstp_port_struct_t *mstp_port =
if(!mstp_port) (struct mstp_port_struct_t *) poPort;
{ if (!mstp_port) {
return; return;
} }
poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData; poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData;
if(!poSharedData) if (!poSharedData) {
{ return;
return; }
}
switch (baud) { switch (baud) {
case 9600: case 9600:
poSharedData->RS485_Baud = B9600; poSharedData->RS485_Baud = B9600;
break; break;
case 19200: case 19200:
poSharedData->RS485_Baud = B19200; poSharedData->RS485_Baud = B19200;
break; break;
case 38400: case 38400:
poSharedData->RS485_Baud = B38400; poSharedData->RS485_Baud = B38400;
break; break;
case 57600: case 57600:
poSharedData->RS485_Baud = B57600; poSharedData->RS485_Baud = B57600;
break; break;
case 115200: case 115200:
poSharedData->RS485_Baud = B115200; poSharedData->RS485_Baud = B115200;
break; break;
default: default:
break; break;
@@ -798,19 +790,18 @@ void dlmstp_set_baud_rate(
} }
uint32_t dlmstp_baud_rate( uint32_t dlmstp_baud_rate(
void * poPort) void *poPort)
{ {
SHARED_MSTP_DATA * poSharedData; SHARED_MSTP_DATA *poSharedData;
struct mstp_port_struct_t * mstp_port = (struct mstp_port_struct_t *) poPort; struct mstp_port_struct_t *mstp_port =
if(!mstp_port) (struct mstp_port_struct_t *) poPort;
{ if (!mstp_port) {
return false; return false;
} }
poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData; poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData;
if(!poSharedData) if (!poSharedData) {
{ return false;
return false; }
}
switch (poSharedData->RS485_Baud) { switch (poSharedData->RS485_Baud) {
case B19200: case B19200:
@@ -828,21 +819,20 @@ uint32_t dlmstp_baud_rate(
} }
void dlmstp_get_my_address( void dlmstp_get_my_address(
void * poPort, void *poPort,
BACNET_ADDRESS * my_address) BACNET_ADDRESS * my_address)
{ {
int i = 0; /* counter */ int i = 0; /* counter */
SHARED_MSTP_DATA * poSharedData; SHARED_MSTP_DATA *poSharedData;
struct mstp_port_struct_t * mstp_port = (struct mstp_port_struct_t *) poPort; struct mstp_port_struct_t *mstp_port =
if(!mstp_port) (struct mstp_port_struct_t *) poPort;
{ if (!mstp_port) {
return; return;
} }
poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData; poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData;
if(!poSharedData) if (!poSharedData) {
{ return;
return; }
}
my_address->mac_len = 1; my_address->mac_len = 1;
my_address->mac[0] = mstp_port->This_Station; my_address->mac[0] = mstp_port->This_Station;
my_address->net = 0; /* local only, no routing */ my_address->net = 0; /* local only, no routing */
@@ -873,28 +863,30 @@ void dlmstp_get_broadcast_address(
} }
bool dlmstp_init( bool dlmstp_init(
void * poPort, void *poPort,
char *ifname) char *ifname)
{ {
unsigned long hThread = 0; unsigned long hThread = 0;
int rv = 0; int rv = 0;
SHARED_MSTP_DATA * poSharedData; SHARED_MSTP_DATA *poSharedData;
struct mstp_port_struct_t * mstp_port = (struct mstp_port_struct_t*)poPort; struct mstp_port_struct_t *mstp_port =
if(!mstp_port) (struct mstp_port_struct_t *) poPort;
{ if (!mstp_port) {
return false; return false;
} }
poSharedData = (SHARED_MSTP_DATA *) ((struct mstp_port_struct_t*)mstp_port)->UserData; poSharedData =
if(!poSharedData) (SHARED_MSTP_DATA *) ((struct mstp_port_struct_t *) mstp_port)->
{ UserData;
return false; if (!poSharedData) {
} return false;
}
poSharedData->RS485_Port_Name = ifname; poSharedData->RS485_Port_Name = ifname;
/* initialize PDU queue */ /* initialize PDU queue */
Ringbuf_Init(&poSharedData->PDU_Queue, (uint8_t *) & poSharedData->PDU_Buffer, Ringbuf_Init(&poSharedData->PDU_Queue,
sizeof(struct mstp_pdu_packet), MSTP_PDU_PACKET_COUNT); (uint8_t *) & poSharedData->PDU_Buffer, sizeof(struct mstp_pdu_packet),
MSTP_PDU_PACKET_COUNT);
/* initialize packet queue */ /* initialize packet queue */
poSharedData->Receive_Packet.ready = false; poSharedData->Receive_Packet.ready = false;
poSharedData->Receive_Packet.pdu_len = 0; poSharedData->Receive_Packet.pdu_len = 0;
@@ -918,7 +910,9 @@ bool dlmstp_init(
Open device for reading and writing. Open device for reading and writing.
Blocking mode - more CPU effecient Blocking mode - more CPU effecient
*/ */
poSharedData->RS485_Handle = open(poSharedData->RS485_Port_Name, O_RDWR | O_NOCTTY | O_NONBLOCK/*| O_NDELAY */ ); poSharedData->RS485_Handle =
open(poSharedData->RS485_Port_Name,
O_RDWR | O_NOCTTY | O_NONBLOCK /*| O_NDELAY */ );
if (poSharedData->RS485_Handle < 0) { if (poSharedData->RS485_Handle < 0) {
perror(poSharedData->RS485_Port_Name); perror(poSharedData->RS485_Port_Name);
exit(-1); exit(-1);
@@ -941,7 +935,8 @@ bool dlmstp_init(
CLOCAL : local connection, no modem contol CLOCAL : local connection, no modem contol
CREAD : enable receiving characters CREAD : enable receiving characters
*/ */
newtio.c_cflag = poSharedData->RS485_Baud | poSharedData->RS485MOD | CLOCAL | CREAD; newtio.c_cflag =
poSharedData->RS485_Baud | poSharedData->RS485MOD | CLOCAL | CREAD;
/* Raw input */ /* Raw input */
newtio.c_iflag = 0; newtio.c_iflag = 0;
/* Raw output */ /* Raw output */
@@ -954,7 +949,8 @@ bool dlmstp_init(
usleep(200000); usleep(200000);
tcflush(poSharedData->RS485_Handle, TCIOFLUSH); tcflush(poSharedData->RS485_Handle, TCIOFLUSH);
/* ringbuffer */ /* ringbuffer */
FIFO_Init(&poSharedData->Rx_FIFO, poSharedData->Rx_Buffer, sizeof(poSharedData->Rx_Buffer)); FIFO_Init(&poSharedData->Rx_FIFO, poSharedData->Rx_Buffer,
sizeof(poSharedData->Rx_Buffer));
printf("=success!\n"); printf("=success!\n");
mstp_port->InputBuffer = &poSharedData->RxBuffer[0]; mstp_port->InputBuffer = &poSharedData->RxBuffer[0];
mstp_port->InputBufferSize = sizeof(poSharedData->RxBuffer); mstp_port->InputBufferSize = sizeof(poSharedData->RxBuffer);
@@ -967,7 +963,8 @@ bool dlmstp_init(
#if PRINT_ENABLED #if PRINT_ENABLED
fprintf(stderr, "MS/TP MAC: %02X\n", mstp_port->This_Station); fprintf(stderr, "MS/TP MAC: %02X\n", mstp_port->This_Station);
fprintf(stderr, "MS/TP Max_Master: %02X\n", mstp_port->Nmax_master); fprintf(stderr, "MS/TP Max_Master: %02X\n", mstp_port->Nmax_master);
fprintf(stderr, "MS/TP Max_Info_Frames: %u\n", mstp_port->Nmax_info_frames); fprintf(stderr, "MS/TP Max_Info_Frames: %u\n",
mstp_port->Nmax_info_frames);
#endif #endif
rv = pthread_create(&hThread, NULL, dlmstp_master_fsm_task, mstp_port); rv = pthread_create(&hThread, NULL, dlmstp_master_fsm_task, mstp_port);
+71 -73
View File
@@ -62,91 +62,90 @@ struct mstp_pdu_packet {
uint8_t buffer[MAX_MPDU]; uint8_t buffer[MAX_MPDU];
}; };
typedef struct shared_mstp_data typedef struct shared_mstp_data {
{ /* Number of MS/TP Packets Rx/Tx */
/* Number of MS/TP Packets Rx/Tx */ uint16_t MSTP_Packets;
uint16_t MSTP_Packets;
/* packet queues */ /* packet queues */
DLMSTP_PACKET Receive_Packet; DLMSTP_PACKET Receive_Packet;
DLMSTP_PACKET Transmit_Packet; DLMSTP_PACKET Transmit_Packet;
/* /*
RT_COND Receive_Packet_Flag; RT_COND Receive_Packet_Flag;
RT_MUTEX Receive_Packet_Mutex; RT_MUTEX Receive_Packet_Mutex;
*/ */
pthread_cond_t Receive_Packet_Flag; pthread_cond_t Receive_Packet_Flag;
pthread_mutex_t Receive_Packet_Mutex; pthread_mutex_t Receive_Packet_Mutex;
/* mechanism to wait for a frame in state machine */ /* mechanism to wait for a frame in state machine */
/* /*
RT_COND Received_Frame_Flag; RT_COND Received_Frame_Flag;
RT_MUTEX Received_Frame_Mutex; RT_MUTEX Received_Frame_Mutex;
*/ */
pthread_cond_t Received_Frame_Flag; pthread_cond_t Received_Frame_Flag;
pthread_mutex_t Received_Frame_Mutex; pthread_mutex_t Received_Frame_Mutex;
pthread_cond_t Master_Done_Flag; pthread_cond_t Master_Done_Flag;
pthread_mutex_t Master_Done_Mutex; pthread_mutex_t Master_Done_Mutex;
/* buffers needed by mstp port struct */ /* buffers needed by mstp port struct */
uint8_t TxBuffer[MAX_MPDU]; uint8_t TxBuffer[MAX_MPDU];
uint8_t RxBuffer[MAX_MPDU]; uint8_t RxBuffer[MAX_MPDU];
/* The minimum time without a DataAvailable or ReceiveError event */ /* The minimum time without a DataAvailable or ReceiveError event */
/* that a node must wait for a station to begin replying to a */ /* that a node must wait for a station to begin replying to a */
/* confirmed request: 255 milliseconds. (Implementations may use */ /* confirmed request: 255 milliseconds. (Implementations may use */
/* larger values for this timeout, not to exceed 300 milliseconds.) */ /* larger values for this timeout, not to exceed 300 milliseconds.) */
uint16_t Treply_timeout; uint16_t Treply_timeout;
/* The minimum time without a DataAvailable or ReceiveError event that a */ /* The minimum time without a DataAvailable or ReceiveError event that a */
/* node must wait for a remote node to begin using a token or replying to */ /* node must wait for a remote node to begin using a token or replying to */
/* a Poll For Master frame: 20 milliseconds. (Implementations may use */ /* a Poll For Master frame: 20 milliseconds. (Implementations may use */
/* larger values for this timeout, not to exceed 100 milliseconds.) */ /* larger values for this timeout, not to exceed 100 milliseconds.) */
uint8_t Tusage_timeout; uint8_t Tusage_timeout;
/* Timer that indicates line silence - and functions */ /* Timer that indicates line silence - and functions */
uint16_t SilenceTime; uint16_t SilenceTime;
/* handle returned from open() */ /* handle returned from open() */
int RS485_Handle; int RS485_Handle;
/* baudrate settings are defined in <asm/termbits.h>, which is /* baudrate settings are defined in <asm/termbits.h>, which is
included by <termios.h> */ included by <termios.h> */
unsigned int RS485_Baud; unsigned int RS485_Baud;
/* serial port name, /dev/ttyS0, /* serial port name, /dev/ttyS0,
/dev/ttyUSB0 for USB->RS485 from B&B Electronics USOPTL4 */ /dev/ttyUSB0 for USB->RS485 from B&B Electronics USOPTL4 */
char *RS485_Port_Name; char *RS485_Port_Name;
/* serial I/O settings */ /* serial I/O settings */
struct termios RS485_oldtio; struct termios RS485_oldtio;
/* some terminal I/O have RS-485 specific functionality */ /* some terminal I/O have RS-485 specific functionality */
tcflag_t RS485MOD; tcflag_t RS485MOD;
/* Ring buffer for incoming bytes, in order to speed up the receiving. */ /* Ring buffer for incoming bytes, in order to speed up the receiving. */
FIFO_BUFFER Rx_FIFO; FIFO_BUFFER Rx_FIFO;
/* buffer size needs to be a power of 2 */ /* buffer size needs to be a power of 2 */
uint8_t Rx_Buffer[4096]; uint8_t Rx_Buffer[4096];
struct timeval start; struct timeval start;
RING_BUFFER PDU_Queue; RING_BUFFER PDU_Queue;
struct mstp_pdu_packet PDU_Buffer[MSTP_PDU_PACKET_COUNT]; struct mstp_pdu_packet PDU_Buffer[MSTP_PDU_PACKET_COUNT];
}SHARED_MSTP_DATA; } SHARED_MSTP_DATA;
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
bool dlmstp_init( bool dlmstp_init(
void * poShared, void *poShared,
char *ifname); char *ifname);
void dlmstp_reset( void dlmstp_reset(
void * poShared); void *poShared);
void dlmstp_cleanup( void dlmstp_cleanup(
void * poShared); void *poShared);
/* returns number of bytes sent on success, negative on failure */ /* returns number of bytes sent on success, negative on failure */
int dlmstp_send_pdu( int dlmstp_send_pdu(
void * poShared, void *poShared,
BACNET_ADDRESS * dest, /* destination address */ BACNET_ADDRESS * dest, /* destination address */
uint8_t * pdu, /* any data to be sent - may be null */ uint8_t * pdu, /* any data to be sent - may be null */
unsigned pdu_len); /* number of bytes of data */ unsigned pdu_len); /* number of bytes of data */
/* returns the number of octets in the PDU, or zero on failure */ /* returns the number of octets in the PDU, or zero on failure */
uint16_t dlmstp_receive( uint16_t dlmstp_receive(
void * poShared, void *poShared,
BACNET_ADDRESS * src, /* source address */ BACNET_ADDRESS * src, /* source address */
uint8_t * pdu, /* PDU data */ uint8_t * pdu, /* PDU data */
uint16_t max_pdu, /* amount of space available in the PDU */ uint16_t max_pdu, /* amount of space available in the PDU */
@@ -160,10 +159,10 @@ extern "C" {
/* bandwidth to particular nodes. If Max_Info_Frames is not writable in a */ /* bandwidth to particular nodes. If Max_Info_Frames is not writable in a */
/* node, its value shall be 1. */ /* node, its value shall be 1. */
void dlmstp_set_max_info_frames( void dlmstp_set_max_info_frames(
void * poShared, void *poShared,
uint8_t max_info_frames); uint8_t max_info_frames);
uint8_t dlmstp_max_info_frames( uint8_t dlmstp_max_info_frames(
void * poShared); void *poShared);
/* This parameter represents the value of the Max_Master property of the */ /* This parameter represents the value of the Max_Master property of the */
/* node's Device object. The value of Max_Master specifies the highest */ /* node's Device object. The value of Max_Master specifies the highest */
@@ -171,30 +170,30 @@ extern "C" {
/* less than or equal to 127. If Max_Master is not writable in a node, */ /* less than or equal to 127. If Max_Master is not writable in a node, */
/* its value shall be 127. */ /* its value shall be 127. */
void dlmstp_set_max_master( void dlmstp_set_max_master(
void * poShared, void *poShared,
uint8_t max_master); uint8_t max_master);
uint8_t dlmstp_max_master( uint8_t dlmstp_max_master(
void * poShared); void *poShared);
/* MAC address 0-127 */ /* MAC address 0-127 */
void dlmstp_set_mac_address( void dlmstp_set_mac_address(
void * poShared, void *poShared,
uint8_t my_address); uint8_t my_address);
uint8_t dlmstp_mac_address( uint8_t dlmstp_mac_address(
void * poShared); void *poShared);
void dlmstp_get_my_address( void dlmstp_get_my_address(
void * poShared, void *poShared,
BACNET_ADDRESS * my_address); BACNET_ADDRESS * my_address);
void dlmstp_get_broadcast_address( void dlmstp_get_broadcast_address(
BACNET_ADDRESS * dest); /* destination address */ BACNET_ADDRESS * dest); /* destination address */
/* RS485 Baud Rate 9600, 19200, 38400, 57600, 115200 */ /* RS485 Baud Rate 9600, 19200, 38400, 57600, 115200 */
void dlmstp_set_baud_rate( void dlmstp_set_baud_rate(
void * poShared, void *poShared,
uint32_t baud); uint32_t baud);
uint32_t dlmstp_baud_rate( uint32_t dlmstp_baud_rate(
void * poShared); void *poShared);
void dlmstp_fill_bacnet_address( void dlmstp_fill_bacnet_address(
BACNET_ADDRESS * src, BACNET_ADDRESS * src,
@@ -206,5 +205,4 @@ extern "C" {
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif /* __cplusplus */ #endif /* __cplusplus */
#endif /*DLMSTP_LINUX_H */
#endif /*DLMSTP_LINUX_H*/
+6 -6
View File
@@ -46,28 +46,28 @@
#include <sys/un.h> /* for Unix domain sockets */ #include <sys/un.h> /* for Unix domain sockets */
#ifdef HAVE_SYS_SELECT_H #ifdef HAVE_SYS_SELECT_H
# include <sys/select.h> /* for convenience */ #include <sys/select.h> /* for convenience */
#endif #endif
#ifdef HAVE_POLL_H #ifdef HAVE_POLL_H
# include <poll.h> /* for convenience */ #include <poll.h> /* for convenience */
#endif #endif
#ifdef HAVE_STRINGS_H #ifdef HAVE_STRINGS_H
# include <strings.h> /* for convenience */ #include <strings.h> /* for convenience */
#endif #endif
/* Three headers are normally needed for socket/file ioctl's: /* Three headers are normally needed for socket/file ioctl's:
* <sys/ioctl.h>, <sys/filio.h>, and <sys/sockio.h>. * <sys/ioctl.h>, <sys/filio.h>, and <sys/sockio.h>.
*/ */
#ifdef HAVE_SYS_IOCTL_H #ifdef HAVE_SYS_IOCTL_H
# include <sys/ioctl.h> #include <sys/ioctl.h>
#endif #endif
#ifdef HAVE_SYS_FILIO_H #ifdef HAVE_SYS_FILIO_H
# include <sys/filio.h> #include <sys/filio.h>
#endif #endif
#ifdef HAVE_SYS_SOCKIO_H #ifdef HAVE_SYS_SOCKIO_H
# include <sys/sockio.h> #include <sys/sockio.h>
#endif #endif
#include <pthread.h> #include <pthread.h>
+141 -145
View File
@@ -54,8 +54,8 @@
#include <termios.h> #include <termios.h>
#include <unistd.h> #include <unistd.h>
#include <sched.h> #include <sched.h>
#include <linux/serial.h> /* for struct serial_struct */ #include <linux/serial.h> /* for struct serial_struct */
#include <math.h> /* for calculation of custom divisor */ #include <math.h> /* for calculation of custom divisor */
#include <sys/ioctl.h> #include <sys/ioctl.h>
/* Local includes */ /* Local includes */
@@ -187,8 +187,8 @@ uint32_t RS485_Get_Baud_Rate(
break; break;
case B38400: case B38400:
if (!RS485_SpecBaud) { if (!RS485_SpecBaud) {
/* Linux asks for custom divisor /* Linux asks for custom divisor
only when baud is set on 38400 */ only when baud is set on 38400 */
baud = 38400; baud = 38400;
} else { } else {
baud = 76800; baud = 76800;
@@ -217,14 +217,13 @@ uint32_t RS485_Get_Baud_Rate(
* NOTES: none * NOTES: none
*****************************************************************************/ *****************************************************************************/
uint32_t RS485_Get_Port_Baud_Rate( uint32_t RS485_Get_Port_Baud_Rate(
volatile struct mstp_port_struct_t *mstp_port) volatile struct mstp_port_struct_t * mstp_port)
{ {
uint32_t baud = 0; uint32_t baud = 0;
SHARED_MSTP_DATA * poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData; SHARED_MSTP_DATA *poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData;
if(!poSharedData) if (!poSharedData) {
{ return 0;
return 0; }
}
switch (poSharedData->RS485_Baud) { switch (poSharedData->RS485_Baud) {
case B0: case B0:
baud = 0; baud = 0;
@@ -387,66 +386,63 @@ void RS485_Send_Frame(
volatile struct mstp_port_struct_t *mstp_port, /* port specific data */ 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) uint16_t nbytes)
{ /* number of bytes of data (up to 501) */ { /* number of bytes of data (up to 501) */
uint32_t turnaround_time = Tturnaround * 1000; uint32_t turnaround_time = Tturnaround * 1000;
uint32_t baud; uint32_t baud;
ssize_t written = 0; ssize_t written = 0;
int greska; int greska;
SHARED_MSTP_DATA * poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData; SHARED_MSTP_DATA *poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData;
if(!poSharedData) if (!poSharedData) {
{ baud = RS485_Get_Baud_Rate();
baud = RS485_Get_Baud_Rate(); /* sleeping for turnaround time is necessary to give other devices
/* sleeping for turnaround time is necessary to give other devices time to change from sending to receiving state. */
time to change from sending to receiving state. */ usleep(turnaround_time / baud);
usleep(turnaround_time / baud); /*
/* On success, the number of bytes written are returned (zero indicates
On success, the number of bytes written are returned (zero indicates nothing was written). On error, -1 is returned, and errno is set
nothing was written). On error, -1 is returned, and errno is set appropriately. If count is zero and the file descriptor refers to a
appropriately. If count is zero and the file descriptor refers to a regular file, 0 will be returned without causing any other effect. For
regular file, 0 will be returned without causing any other effect. For a special file, the results are not portable.
a special file, the results are not portable. */
*/ written = write(RS485_Handle, buffer, nbytes);
written = write(RS485_Handle, buffer, nbytes); greska = errno;
greska = errno; if (written <= 0) {
if (written <= 0) { printf("write error: %s\n", strerror(greska));
printf("write error: %s\n", strerror(greska)); } else {
} else { /* wait until all output has been transmitted. */
/* wait until all output has been transmitted. */ tcdrain(RS485_Handle);
tcdrain(RS485_Handle); }
} /* tcdrain(RS485_Handle); */
/* tcdrain(RS485_Handle); */ /* per MSTP spec, sort of */
/* per MSTP spec, sort of */ if (mstp_port) {
if (mstp_port) { mstp_port->SilenceTimerReset((void *) mstp_port);
mstp_port->SilenceTimerReset((void*)mstp_port); }
} } else {
} baud = RS485_Get_Port_Baud_Rate(mstp_port);
else /* sleeping for turnaround time is necessary to give other devices
{ time to change from sending to receiving state. */
baud = RS485_Get_Port_Baud_Rate(mstp_port); usleep(turnaround_time / baud);
/* sleeping for turnaround time is necessary to give other devices /*
time to change from sending to receiving state. */ On success, the number of bytes written are returned (zero indicates
usleep(turnaround_time / baud); nothing was written). On error, -1 is returned, and errno is set
/* appropriately. If count is zero and the file descriptor refers to a
On success, the number of bytes written are returned (zero indicates regular file, 0 will be returned without causing any other effect. For
nothing was written). On error, -1 is returned, and errno is set a special file, the results are not portable.
appropriately. If count is zero and the file descriptor refers to a */
regular file, 0 will be returned without causing any other effect. For written = write(poSharedData->RS485_Handle, buffer, nbytes);
a special file, the results are not portable. greska = errno;
*/ if (written <= 0) {
written = write(poSharedData->RS485_Handle, buffer, nbytes); printf("write error: %s\n", strerror(greska));
greska = errno; } else {
if (written <= 0) { /* wait until all output has been transmitted. */
printf("write error: %s\n", strerror(greska)); tcdrain(poSharedData->RS485_Handle);
} else { }
/* wait until all output has been transmitted. */ /* tcdrain(RS485_Handle); */
tcdrain(poSharedData->RS485_Handle); /* per MSTP spec, sort of */
} if (mstp_port) {
/* tcdrain(RS485_Handle); */ mstp_port->SilenceTimerReset((void *) mstp_port);
/* per MSTP spec, sort of */ }
if (mstp_port) { }
mstp_port->SilenceTimerReset((void*)mstp_port);
}
}
return; return;
} }
@@ -465,75 +461,73 @@ void RS485_Check_UART_Data(
uint8_t buf[2048]; uint8_t buf[2048];
int n; int n;
SHARED_MSTP_DATA * poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData; SHARED_MSTP_DATA *poSharedData = (SHARED_MSTP_DATA *) mstp_port->UserData;
if(!poSharedData) if (!poSharedData) {
{ if (mstp_port->ReceiveError == true) {
if (mstp_port->ReceiveError == true) { /* do nothing but wait for state machine to clear the error */
/* do nothing but wait for state machine to clear the error */ /* burning time, so wait a longer time */
/* burning time, so wait a longer time */ waiter.tv_sec = 0;
waiter.tv_sec = 0; waiter.tv_usec = 5000;
waiter.tv_usec = 5000; } else if (mstp_port->DataAvailable == false) {
} else if (mstp_port->DataAvailable == false) { /* wait for state machine to read from the DataRegister */
/* wait for state machine to read from the DataRegister */ if (FIFO_Count(&Rx_FIFO) > 0) {
if (FIFO_Count(&Rx_FIFO) > 0) { /* data is available */
/* data is available */ mstp_port->DataRegister = FIFO_Get(&Rx_FIFO);
mstp_port->DataRegister = FIFO_Get(&Rx_FIFO); mstp_port->DataAvailable = true;
mstp_port->DataAvailable = true; /* FIFO is giving data - don't wait very long */
/* FIFO is giving data - don't wait very long */ waiter.tv_sec = 0;
waiter.tv_sec = 0; waiter.tv_usec = 10;
waiter.tv_usec = 10; } else {
} else { /* FIFO is empty - wait a longer time */
/* FIFO is empty - wait a longer time */ waiter.tv_sec = 0;
waiter.tv_sec = 0; waiter.tv_usec = 5000;
waiter.tv_usec = 5000; }
} }
} /* grab bytes and stuff them into the FIFO every time */
/* grab bytes and stuff them into the FIFO every time */ FD_ZERO(&input);
FD_ZERO(&input); FD_SET(RS485_Handle, &input);
FD_SET(RS485_Handle, &input); n = select(RS485_Handle + 1, &input, NULL, NULL, &waiter);
n = select(RS485_Handle + 1, &input, NULL, NULL, &waiter); if (n < 0) {
if (n < 0) { return;
return; }
} if (FD_ISSET(RS485_Handle, &input)) {
if (FD_ISSET(RS485_Handle, &input)) { n = read(RS485_Handle, buf, sizeof(buf));
n = read(RS485_Handle, buf, sizeof(buf)); FIFO_Add(&Rx_FIFO, &buf[0], n);
FIFO_Add(&Rx_FIFO, &buf[0], n); }
} } else {
} if (mstp_port->ReceiveError == true) {
else /* do nothing but wait for state machine to clear the error */
{ /* burning time, so wait a longer time */
if (mstp_port->ReceiveError == true) { waiter.tv_sec = 0;
/* do nothing but wait for state machine to clear the error */ waiter.tv_usec = 5000;
/* burning time, so wait a longer time */ } else if (mstp_port->DataAvailable == false) {
waiter.tv_sec = 0; /* wait for state machine to read from the DataRegister */
waiter.tv_usec = 5000; if (FIFO_Count(&poSharedData->Rx_FIFO) > 0) {
} else if (mstp_port->DataAvailable == false) { /* data is available */
/* wait for state machine to read from the DataRegister */ mstp_port->DataRegister = FIFO_Get(&poSharedData->Rx_FIFO);
if (FIFO_Count(&poSharedData->Rx_FIFO) > 0) { mstp_port->DataAvailable = true;
/* data is available */ /* FIFO is giving data - don't wait very long */
mstp_port->DataRegister = FIFO_Get(&poSharedData->Rx_FIFO); waiter.tv_sec = 0;
mstp_port->DataAvailable = true; waiter.tv_usec = 10;
/* FIFO is giving data - don't wait very long */ } else {
waiter.tv_sec = 0; /* FIFO is empty - wait a longer time */
waiter.tv_usec = 10; waiter.tv_sec = 0;
} else { waiter.tv_usec = 5000;
/* FIFO is empty - wait a longer time */ }
waiter.tv_sec = 0; }
waiter.tv_usec = 5000; /* grab bytes and stuff them into the FIFO every time */
} FD_ZERO(&input);
} FD_SET(poSharedData->RS485_Handle, &input);
/* grab bytes and stuff them into the FIFO every time */ n = select(poSharedData->RS485_Handle + 1, &input, NULL, NULL,
FD_ZERO(&input); &waiter);
FD_SET(poSharedData->RS485_Handle, &input); if (n < 0) {
n = select(poSharedData->RS485_Handle + 1, &input, NULL, NULL, &waiter); return;
if (n < 0) { }
return; if (FD_ISSET(poSharedData->RS485_Handle, &input)) {
} n = read(poSharedData->RS485_Handle, buf, sizeof(buf));
if (FD_ISSET(poSharedData->RS485_Handle, &input)) { FIFO_Add(&poSharedData->Rx_FIFO, &buf[0], n);
n = read(poSharedData->RS485_Handle, buf, sizeof(buf)); }
FIFO_Add(&poSharedData->Rx_FIFO, &buf[0], n); }
}
}
} }
void RS485_Cleanup( void RS485_Cleanup(
@@ -541,7 +535,7 @@ void RS485_Cleanup(
{ {
/* restore the old port settings */ /* restore the old port settings */
tcsetattr(RS485_Handle, TCSANOW, &RS485_oldtio); tcsetattr(RS485_Handle, TCSANOW, &RS485_oldtio);
ioctl (RS485_Handle, TIOCSSERIAL, &RS485_oldserial); ioctl(RS485_Handle, TIOCSSERIAL, &RS485_oldserial);
close(RS485_Handle); close(RS485_Handle);
} }
@@ -573,9 +567,9 @@ void RS485_Initialize(
/* save current serial port settings */ /* save current serial port settings */
tcgetattr(RS485_Handle, &RS485_oldtio); tcgetattr(RS485_Handle, &RS485_oldtio);
/* we read the old serial setup */ /* we read the old serial setup */
ioctl (RS485_Handle, TIOCGSERIAL, &RS485_oldserial); ioctl(RS485_Handle, TIOCGSERIAL, &RS485_oldserial);
/* we need a copy of existing settings */ /* we need a copy of existing settings */
memcpy (&newserial, &RS485_oldserial, sizeof (struct serial_struct)); memcpy(&newserial, &RS485_oldserial, sizeof(struct serial_struct));
/* clear struct for new port settings */ /* clear struct for new port settings */
bzero(&newtio, sizeof(newtio)); bzero(&newtio, sizeof(newtio));
/* /*
@@ -599,19 +593,21 @@ void RS485_Initialize(
/* 76800, custom divisor must be set */ /* 76800, custom divisor must be set */
newserial.flags |= ASYNC_SPD_CUST; newserial.flags |= ASYNC_SPD_CUST;
newserial.custom_divisor = newserial.custom_divisor =
round (((float)newserial.baud_base)/76800); round(((float) newserial.baud_base) / 76800);
/* we must check that we calculated some sane value; /* we must check that we calculated some sane value;
small baud bases yield bad custom divisor values */ small baud bases yield bad custom divisor values */
baud_error = fabs (1 -((float)newserial.baud_base)/ baud_error =
((float)newserial.custom_divisor)/76800); fabs(1 -
((float) newserial.baud_base) /
((float) newserial.custom_divisor) / 76800);
if ((newserial.custom_divisor == 0) || (baud_error > 0.02)) { if ((newserial.custom_divisor == 0) || (baud_error > 0.02)) {
/* bad divisor */ /* bad divisor */
fprintf (stderr, "bad custom divisor %d, base baud %d\n", fprintf(stderr, "bad custom divisor %d, base baud %d\n",
newserial.custom_divisor, newserial.baud_base); newserial.custom_divisor, newserial.baud_base);
exit (EXIT_FAILURE); exit(EXIT_FAILURE);
} }
/* if all goes well, set new divisor */ /* if all goes well, set new divisor */
ioctl (RS485_Handle, TIOCSSERIAL, &newserial); ioctl(RS485_Handle, TIOCSSERIAL, &newserial);
} }
/* destructor */ /* destructor */
+13 -14
View File
@@ -94,7 +94,7 @@ uint16_t bip_get_port(
static void bip_mac_to_addr( static void bip_mac_to_addr(
struct ip_addr *address, struct ip_addr *address,
uint8_t *mac) uint8_t * mac)
{ {
if (mac && address) { if (mac && address) {
address->addr = ((u32_t) ((((uint32_t) mac[0]) << 24) & 0xff000000)); address->addr = ((u32_t) ((((uint32_t) mac[0]) << 24) & 0xff000000));
@@ -105,14 +105,14 @@ static void bip_mac_to_addr(
} }
static void bip_addr_to_mac( static void bip_addr_to_mac(
uint8_t *mac, uint8_t * mac,
struct ip_addr *address) struct ip_addr *address)
{ {
if (mac && address) { if (mac && address) {
mac[0] = (uint8_t)(address->addr >> 24); mac[0] = (uint8_t) (address->addr >> 24);
mac[1] = (uint8_t)(address->addr >> 16); mac[1] = (uint8_t) (address->addr >> 16);
mac[2] = (uint8_t)(address->addr >> 8); mac[2] = (uint8_t) (address->addr >> 8);
mac[3] = (uint8_t)(address->addr); mac[3] = (uint8_t) (address->addr);
} }
} }
@@ -161,7 +161,7 @@ int bip_send_pdu(
if (pkt == NULL) { if (pkt == NULL) {
return 0; return 0;
} }
mtu = (uint8_t *)pkt->payload; mtu = (uint8_t *) pkt->payload;
mtu[0] = BVLL_TYPE_BACNET_IP; mtu[0] = BVLL_TYPE_BACNET_IP;
if (dest->net == BACNET_BROADCAST_NETWORK) { if (dest->net == BACNET_BROADCAST_NETWORK) {
/* broadcast */ /* broadcast */
@@ -209,7 +209,7 @@ void bip_server_callback(
}; /* address where message came from */ }; /* address where message came from */
struct ip_addr sin_addr; struct ip_addr sin_addr;
uint16_t sin_port = 0; uint16_t sin_port = 0;
uint8_t *pdu = (uint8_t *)pkt->payload; uint8_t *pdu = (uint8_t *) pkt->payload;
/* the signature of a BACnet/IP packet */ /* the signature of a BACnet/IP packet */
if (pdu[0] != BVLL_TYPE_BACNET_IP) { if (pdu[0] != BVLL_TYPE_BACNET_IP) {
@@ -219,8 +219,7 @@ void bip_server_callback(
if ((function == BVLC_ORIGINAL_UNICAST_NPDU) || if ((function == BVLC_ORIGINAL_UNICAST_NPDU) ||
(function == BVLC_ORIGINAL_BROADCAST_NPDU)) { (function == BVLC_ORIGINAL_BROADCAST_NPDU)) {
/* ignore messages from me */ /* ignore messages from me */
if ((addr->addr == BIP_Address.s_addr) && if ((addr->addr == BIP_Address.s_addr) && (port == BIP_Port)) {
(port == BIP_Port)) {
pdu_len = 0; pdu_len = 0;
} else { } else {
/* data in src->mac[] is in network format */ /* data in src->mac[] is in network format */
@@ -236,8 +235,7 @@ void bip_server_callback(
} else if (function == BVLC_FORWARDED_NPDU) { } else if (function == BVLC_FORWARDED_NPDU) {
bip_mac_to_addr(&sin_addr, &pdu[4]); bip_mac_to_addr(&sin_addr, &pdu[4]);
memcpy(&sin_port, &pdu[8], 2); memcpy(&sin_port, &pdu[8], 2);
if ((sin_addr.addr == BIP_Address.s_addr) && if ((sin_addr.addr == BIP_Address.s_addr) && (sin_port == BIP_Port)) {
(sin_port == BIP_Port)) {
/* ignore forwarded messages from me */ /* ignore forwarded messages from me */
pdu_len = 0; pdu_len = 0;
} else { } else {
@@ -326,12 +324,13 @@ void bip_get_broadcast_address(
bool bip_init( bool bip_init(
char *ifname) char *ifname)
{ {
(void)ifname; (void) ifname;
/* Create a new UDP control block */ /* Create a new UDP control block */
Server_upcb = udp_new(); Server_upcb = udp_new();
if (Server_upcb == NULL) { if (Server_upcb == NULL) {
/* increase MEMP_NUM_UDP_PCB in lwipopts.h */ /* increase MEMP_NUM_UDP_PCB in lwipopts.h */
while(1) {}; while (1) {
};
} }
/* Bind the upcb to the UDP_PORT port */ /* Bind the upcb to the UDP_PORT port */
/* Using IP_ADDR_ANY allow the upcb to be used by any local interface */ /* Using IP_ADDR_ANY allow the upcb to be used by any local interface */
+8 -8
View File
@@ -39,17 +39,17 @@
/* members are in network byte order */ /* members are in network byte order */
struct sockaddr_in { struct sockaddr_in {
u8_t sin_len; u8_t sin_len;
u8_t sin_family; u8_t sin_family;
u16_t sin_port; u16_t sin_port;
struct in_addr sin_addr; struct in_addr sin_addr;
char sin_zero[8]; char sin_zero[8];
}; };
struct sockaddr { struct sockaddr {
u8_t sa_len; u8_t sa_len;
u8_t sa_family; u8_t sa_family;
char sa_data[14]; char sa_data[14];
}; };
#endif #endif
+1 -2
View File
@@ -73,7 +73,7 @@ char *Analog_Input_Name(
static char text_string[16] = ""; /* okay for single thread */ static char text_string[16] = ""; /* okay for single thread */
if (object_instance < MAX_ANALOG_INPUTS) { if (object_instance < MAX_ANALOG_INPUTS) {
sprintf(text_string, "AI-%lu", (unsigned long)object_instance); sprintf(text_string, "AI-%lu", (unsigned long) object_instance);
return text_string; return text_string;
} }
@@ -172,4 +172,3 @@ int Analog_Input_Read_Property(
return apdu_len; return apdu_len;
} }
+2 -2
View File
@@ -333,8 +333,8 @@ bool Analog_Value_Write_Property(
(value.type.Real >= 0.0) && (value.type.Real <= 100.0)) { (value.type.Real >= 0.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
object_instance); (wp_data->object_instance);
priority--; priority--;
Present_Value[object_index] = level; Present_Value[object_index] = level;
/* Note: you could set the physical output here if we /* Note: you could set the physical output here if we
+4 -3
View File
@@ -158,7 +158,8 @@ int Binary_Value_Read_Property(
encode_application_enumerated(&apdu[0], OBJECT_BINARY_VALUE); encode_application_enumerated(&apdu[0], OBJECT_BINARY_VALUE);
break; break;
case PROP_PRESENT_VALUE: case PROP_PRESENT_VALUE:
present_value = Binary_Value_Present_Value(rpdata->object_instance); present_value =
Binary_Value_Present_Value(rpdata->object_instance);
apdu_len = encode_application_enumerated(&apdu[0], present_value); apdu_len = encode_application_enumerated(&apdu[0], present_value);
break; break;
case PROP_STATUS_FLAGS: case PROP_STATUS_FLAGS:
@@ -245,8 +246,8 @@ bool Binary_Value_Write_Property(
(value.type.Enumerated <= MAX_BINARY_PV)) { (value.type.Enumerated <= MAX_BINARY_PV)) {
level = value.type.Enumerated; level = value.type.Enumerated;
object_index = object_index =
Binary_Value_Instance_To_Index(wp_data-> Binary_Value_Instance_To_Index
object_instance); (wp_data->object_instance);
priority--; priority--;
/* NOTE: this Binary value has no priority array */ /* NOTE: this Binary value has no priority array */
Present_Value[object_index] = level; Present_Value[object_index] = level;
+9 -9
View File
@@ -85,7 +85,7 @@ BACNET_REINITIALIZED_STATE Device_Reinitialized_State(
void Device_Init( void Device_Init(
object_functions_t * object_table) object_functions_t * object_table)
{ {
(void)object_table; (void) object_table;
Reinitialize_State = BACNET_REINIT_IDLE; Reinitialize_State = BACNET_REINIT_IDLE;
dcc_set_status_duration(COMMUNICATION_ENABLE, 0); dcc_set_status_duration(COMMUNICATION_ENABLE, 0);
/* FIXME: Get the data from the eeprom */ /* FIXME: Get the data from the eeprom */
@@ -420,10 +420,8 @@ int Device_Read_Property_Local(
} }
} }
} else { } else {
if (Device_Object_List_Identifier( if (Device_Object_List_Identifier(rpdata->array_index,
rpdata->array_index, &object_type, &instance))
&object_type,
&instance))
apdu_len = apdu_len =
encode_application_object_id(&apdu[0], object_type, encode_application_object_id(&apdu[0], object_type,
instance); instance);
@@ -586,8 +584,8 @@ bool Device_Write_Property_Local(
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(value.type.Object_Id. (Device_Set_Object_Instance_Number(value.type.
instance))) { Object_Id.instance))) {
/* we could send an I-Am broadcast to let the world know */ /* we could send an I-Am broadcast to let the world know */
status = true; status = true;
} else { } else {
@@ -646,11 +644,13 @@ bool Device_Write_Property_Local(
the device. */ the device. */
} else { } else {
wp_data->error_class = ERROR_CLASS_PROPERTY; wp_data->error_class = ERROR_CLASS_PROPERTY;
wp_data->error_code = ERROR_CODE_NO_SPACE_TO_WRITE_PROPERTY; wp_data->error_code =
ERROR_CODE_NO_SPACE_TO_WRITE_PROPERTY;
} }
} else { } else {
wp_data->error_class = ERROR_CLASS_PROPERTY; wp_data->error_class = ERROR_CLASS_PROPERTY;
wp_data->error_code = ERROR_CODE_CHARACTER_SET_NOT_SUPPORTED; wp_data->error_code =
ERROR_CODE_CHARACTER_SET_NOT_SUPPORTED;
} }
} else { } else {
wp_data->error_class = ERROR_CLASS_PROPERTY; wp_data->error_class = ERROR_CLASS_PROPERTY;
+5 -6
View File
@@ -916,8 +916,7 @@ bool MSTP_Master_Node_FSM(
should be sent is unknown - so PollForMaster */ should be sent is unknown - so PollForMaster */
mstp_port->Poll_Station = next_this_station; mstp_port->Poll_Station = next_this_station;
MSTP_Create_And_Send_Frame(mstp_port, MSTP_Create_And_Send_Frame(mstp_port,
FRAME_TYPE_POLL_FOR_MASTER, FRAME_TYPE_POLL_FOR_MASTER, mstp_port->Poll_Station,
mstp_port->Poll_Station,
mstp_port->This_Station, NULL, 0); mstp_port->This_Station, NULL, 0);
mstp_port->RetryCount = 0; mstp_port->RetryCount = 0;
mstp_port->master_state = MSTP_MASTER_STATE_POLL_FOR_MASTER; mstp_port->master_state = MSTP_MASTER_STATE_POLL_FOR_MASTER;
@@ -1150,10 +1149,10 @@ bool MSTP_Master_Node_FSM(
see if the message is that same APDU type see if the message is that same APDU type
along with the matching src/dest and invoke ID */ along with the matching src/dest and invoke ID */
matched = matched =
mstp_compare_data_expecting_reply(&mstp_port-> mstp_compare_data_expecting_reply(&mstp_port->InputBuffer
InputBuffer[0], mstp_port->DataLength, [0], mstp_port->DataLength, mstp_port->SourceAddress,
mstp_port->SourceAddress, &mstp_port->TxBuffer[0], &mstp_port->TxBuffer[0], mstp_port->TxLength,
mstp_port->TxLength, mstp_port->TxDestination); mstp_port->TxDestination);
} }
if (matched && mstp_port->TxReady) { if (matched && mstp_port->TxReady) {
/* Reply */ /* Reply */
+2 -1
View File
@@ -261,7 +261,8 @@ bool bip_init(
bip_set_port(htons((0xBAC0)); bip_set_port(htons((0xBAC0));
/* assumes that the driver has already been initialized */ /* assumes that the driver has already been initialized */
sock_fd = socket(AF_INET, SOCK_DGRAM, IPROTO_UDP); sock_fd = socket(AF_INET, SOCK_DGRAM, IPROTO_UDP);
bip_set_socket(sock_fd); if (sock_fd < 0) bip_set_socket(sock_fd);
if (sock_fd < 0)
return false; return false;
/* bind the socket to the local port number and IP address */ /* bind the socket to the local port number and IP address */
sin.sin_family = AF_INET; sin.sin_addr.s_addr = htonl(INADDR_ANY); sin.sin_family = AF_INET; sin.sin_addr.s_addr = htonl(INADDR_ANY);
+2 -2
View File
@@ -436,8 +436,8 @@ bool Binary_Output_Write_Property(
priority = wp_data->priority; priority = wp_data->priority;
if (priority && (priority <= BACNET_MAX_PRIORITY)) { if (priority && (priority <= BACNET_MAX_PRIORITY)) {
priority--; priority--;
Binary_Output_Present_Value_Set(wp_data-> Binary_Output_Present_Value_Set
object_instance, level, priority); (wp_data->object_instance, level, priority);
} else if (priority == 6) { } else if (priority == 6) {
status = false; status = false;
/* Command priority 6 is reserved for use by Minimum On/Off /* Command priority 6 is reserved for use by Minimum On/Off
+8 -8
View File
@@ -838,8 +838,8 @@ bool Device_Write_Property_Local(
&wp_data->error_class, &wp_data->error_code); &wp_data->error_class, &wp_data->error_code);
if (status) { if (status) {
if ((value.type.Object_Id.type == OBJECT_DEVICE) && if ((value.type.Object_Id.type == OBJECT_DEVICE) &&
(Device_Set_Object_Instance_Number(value.type.Object_Id. (Device_Set_Object_Instance_Number(value.type.
instance))) { Object_Id.instance))) {
/* we could send an I-Am broadcast to let the world know */ /* we could send an I-Am broadcast to let the world know */
status = true; status = true;
} else { } else {
@@ -873,8 +873,8 @@ bool Device_Write_Property_Local(
WPValidateString(&value, MAX_DEV_NAME_LEN, false, WPValidateString(&value, MAX_DEV_NAME_LEN, false,
&wp_data->error_class, &wp_data->error_code); &wp_data->error_class, &wp_data->error_code);
if (status) { if (status) {
Device_Set_Object_Name(characterstring_value(&value.type. Device_Set_Object_Name(characterstring_value(&value.
Character_String), type.Character_String),
characterstring_length(&value.type.Character_String)); characterstring_length(&value.type.Character_String));
} }
break; break;
@@ -883,8 +883,8 @@ bool Device_Write_Property_Local(
WPValidateString(&value, MAX_DEV_LOC_LEN, true, WPValidateString(&value, MAX_DEV_LOC_LEN, true,
&wp_data->error_class, &wp_data->error_code); &wp_data->error_class, &wp_data->error_code);
if (status) { if (status) {
Device_Set_Location(characterstring_value(&value.type. Device_Set_Location(characterstring_value(&value.
Character_String), type.Character_String),
characterstring_length(&value.type.Character_String)); characterstring_length(&value.type.Character_String));
} }
break; break;
@@ -894,8 +894,8 @@ bool Device_Write_Property_Local(
WPValidateString(&value, MAX_DEV_DESC_LEN, true, WPValidateString(&value, MAX_DEV_DESC_LEN, true,
&wp_data->error_class, &wp_data->error_code); &wp_data->error_class, &wp_data->error_code);
if (status) { if (status) {
Device_Set_Description(characterstring_value(&value.type. Device_Set_Description(characterstring_value(&value.
Character_String), type.Character_String),
characterstring_length(&value.type.Character_String)); characterstring_length(&value.type.Character_String));
} }
break; break;

Some files were not shown because too many files have changed in this diff Show More