Changed all the C++ comments to C comments using comment.sh script.
This commit is contained in:
@@ -36,11 +36,11 @@
|
||||
#include "bacdcode.h"
|
||||
#include "bacdef.h"
|
||||
|
||||
// encode service
|
||||
/* encode service */
|
||||
int abort_encode_apdu(uint8_t * apdu,
|
||||
uint8_t invoke_id, uint8_t abort_reason)
|
||||
{
|
||||
int apdu_len = 0; // total length of the apdu, return value
|
||||
int apdu_len = 0; /* total length of the apdu, return value */
|
||||
|
||||
if (apdu) {
|
||||
apdu[0] = PDU_TYPE_ABORT;
|
||||
@@ -52,7 +52,7 @@ int abort_encode_apdu(uint8_t * apdu,
|
||||
return apdu_len;
|
||||
}
|
||||
|
||||
// decode the service request only
|
||||
/* decode the service request only */
|
||||
int abort_decode_service_request(uint8_t * apdu,
|
||||
unsigned apdu_len, uint8_t * invoke_id, uint8_t * abort_reason)
|
||||
{
|
||||
@@ -68,7 +68,7 @@ int abort_decode_service_request(uint8_t * apdu,
|
||||
return len;
|
||||
}
|
||||
|
||||
// decode the whole APDU - mainly used for unit testing
|
||||
/* decode the whole APDU - mainly used for unit testing */
|
||||
int abort_decode_apdu(uint8_t * apdu,
|
||||
unsigned apdu_len, uint8_t * invoke_id, uint8_t * abort_reason)
|
||||
{
|
||||
@@ -76,7 +76,7 @@ int abort_decode_apdu(uint8_t * apdu,
|
||||
|
||||
if (!apdu)
|
||||
return -1;
|
||||
// optional checking - most likely was already done prior to this call
|
||||
/* optional checking - most likely was already done prior to this call */
|
||||
if (apdu_len) {
|
||||
if (apdu[0] != PDU_TYPE_ABORT)
|
||||
return -1;
|
||||
@@ -114,24 +114,24 @@ void testAbort(Test * pTest)
|
||||
ct_test(pTest, test_invoke_id == invoke_id);
|
||||
ct_test(pTest, test_abort_reason == abort_reason);
|
||||
|
||||
// change type to get negative response
|
||||
/* change type to get negative response */
|
||||
apdu[0] = PDU_TYPE_REJECT;
|
||||
len = abort_decode_apdu(&apdu[0],
|
||||
apdu_len, &test_invoke_id, &test_abort_reason);
|
||||
ct_test(pTest, len == -1);
|
||||
|
||||
// test NULL APDU
|
||||
/* test NULL APDU */
|
||||
len = abort_decode_apdu(NULL,
|
||||
apdu_len, &test_invoke_id, &test_abort_reason);
|
||||
ct_test(pTest, len == -1);
|
||||
|
||||
// force a zero length
|
||||
/* force a zero length */
|
||||
len = abort_decode_apdu(&apdu[0],
|
||||
0, &test_invoke_id, &test_abort_reason);
|
||||
ct_test(pTest, len == 0);
|
||||
|
||||
|
||||
// check them all...
|
||||
/* check them all... */
|
||||
for (invoke_id = 0; invoke_id < 255; invoke_id++) {
|
||||
for (abort_reason = 0; abort_reason < 255; abort_reason++) {
|
||||
len = abort_encode_apdu(&apdu[0], invoke_id, abort_reason);
|
||||
|
||||
+20
-20
@@ -40,9 +40,9 @@
|
||||
#include "bacdef.h"
|
||||
#include "bacdcode.h"
|
||||
|
||||
// This module is used to handle the address binding that
|
||||
// occurs in BACnet. A device id is bound to a MAC address.
|
||||
// The normal method is using Who-Is, and using the data from I-Am
|
||||
/* This module is used to handle the address binding that */
|
||||
/* occurs in BACnet. A device id is bound to a MAC address. */
|
||||
/* The normal method is using Who-Is, and using the data from I-Am */
|
||||
|
||||
static struct Address_Cache_Entry {
|
||||
bool valid;
|
||||
@@ -54,7 +54,7 @@ static struct Address_Cache_Entry {
|
||||
|
||||
void address_copy(BACNET_ADDRESS * dest, BACNET_ADDRESS * src)
|
||||
{
|
||||
unsigned i = 0; // counter
|
||||
unsigned i = 0; /* counter */
|
||||
|
||||
if (dest && src) {
|
||||
for (i = 0; i < MAX_MAC_LEN; i++) {
|
||||
@@ -103,7 +103,7 @@ bool address_get_by_device(uint32_t device_id,
|
||||
unsigned *max_apdu, BACNET_ADDRESS * src)
|
||||
{
|
||||
unsigned i;
|
||||
bool found = false; // return value
|
||||
bool found = false; /* return value */
|
||||
|
||||
for (i = 0; i < MAX_ADDRESS_CACHE; i++) {
|
||||
if (Address_Cache[i].valid &&
|
||||
@@ -122,9 +122,9 @@ void address_add(uint32_t device_id,
|
||||
unsigned max_apdu, BACNET_ADDRESS * src)
|
||||
{
|
||||
unsigned i;
|
||||
bool found = false; // return value
|
||||
bool found = false; /* return value */
|
||||
|
||||
// existing device - update address
|
||||
/* existing device - update address */
|
||||
for (i = 0; i < MAX_ADDRESS_CACHE; i++) {
|
||||
if (Address_Cache[i].valid &&
|
||||
(Address_Cache[i].device_id == device_id)) {
|
||||
@@ -134,7 +134,7 @@ void address_add(uint32_t device_id,
|
||||
break;
|
||||
}
|
||||
}
|
||||
// new device
|
||||
/* new device */
|
||||
if (!found) {
|
||||
for (i = 0; i < MAX_ADDRESS_CACHE; i++) {
|
||||
if (!Address_Cache[i].valid) {
|
||||
@@ -150,15 +150,15 @@ void address_add(uint32_t device_id,
|
||||
return;
|
||||
}
|
||||
|
||||
// returns true if device is already bound
|
||||
// also returns the address and max apdu if already bound
|
||||
/* returns true if device is already bound */
|
||||
/* also returns the address and max apdu if already bound */
|
||||
bool address_bind_request(uint32_t device_id,
|
||||
unsigned *max_apdu, BACNET_ADDRESS * src)
|
||||
{
|
||||
unsigned i;
|
||||
bool found = false; // return value
|
||||
bool found = false; /* return value */
|
||||
|
||||
// existing device - update address
|
||||
/* existing device - update address */
|
||||
for (i = 0; i < MAX_ADDRESS_CACHE; i++) {
|
||||
if (Address_Cache[i].valid &&
|
||||
(Address_Cache[i].device_id == device_id)) {
|
||||
@@ -167,7 +167,7 @@ bool address_bind_request(uint32_t device_id,
|
||||
*max_apdu = Address_Cache[i].max_apdu;
|
||||
break;
|
||||
}
|
||||
// already have a bind request active for this puppy
|
||||
/* already have a bind request active for this puppy */
|
||||
else if (Address_Cache[i].bind_request &&
|
||||
(Address_Cache[i].device_id == device_id)) {
|
||||
return found;
|
||||
@@ -179,7 +179,7 @@ bool address_bind_request(uint32_t device_id,
|
||||
if (!(Address_Cache[i].bind_request || Address_Cache[i].valid)) {
|
||||
Address_Cache[i].bind_request = true;
|
||||
Address_Cache[i].device_id = device_id;
|
||||
// now would be a good time to do a Who-Is request
|
||||
/* now would be a good time to do a Who-Is request */
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -192,9 +192,9 @@ void address_add_binding(uint32_t device_id,
|
||||
unsigned max_apdu, BACNET_ADDRESS * src)
|
||||
{
|
||||
unsigned i;
|
||||
bool found = false; // return value
|
||||
bool found = false; /* return value */
|
||||
|
||||
// existing device - update address
|
||||
/* existing device - update address */
|
||||
for (i = 0; i < MAX_ADDRESS_CACHE; i++) {
|
||||
if (Address_Cache[i].valid &&
|
||||
(Address_Cache[i].device_id == device_id)) {
|
||||
@@ -204,7 +204,7 @@ void address_add_binding(uint32_t device_id,
|
||||
break;
|
||||
}
|
||||
}
|
||||
// add new device - but only if bind requested
|
||||
/* add new device - but only if bind requested */
|
||||
if (!found) {
|
||||
for (i = 0; i < MAX_ADDRESS_CACHE; i++) {
|
||||
if (!Address_Cache[i].valid && Address_Cache[i].bind_request) {
|
||||
@@ -224,7 +224,7 @@ void address_add_binding(uint32_t device_id,
|
||||
bool address_get_by_index(unsigned index,
|
||||
uint32_t * device_id, unsigned *max_apdu, BACNET_ADDRESS * src)
|
||||
{
|
||||
bool found = false; // return value
|
||||
bool found = false; /* return value */
|
||||
|
||||
if (index < MAX_ADDRESS_CACHE) {
|
||||
if (Address_Cache[index].valid) {
|
||||
@@ -241,7 +241,7 @@ bool address_get_by_index(unsigned index,
|
||||
unsigned address_count(void)
|
||||
{
|
||||
unsigned i;
|
||||
unsigned count = 0; // return value
|
||||
unsigned count = 0; /* return value */
|
||||
|
||||
for (i = 0; i < MAX_ADDRESS_CACHE; i++) {
|
||||
if (Address_Cache[i].valid)
|
||||
@@ -255,7 +255,7 @@ bool address_match(BACNET_ADDRESS * dest, BACNET_ADDRESS * src)
|
||||
{
|
||||
unsigned i;
|
||||
unsigned max_len;
|
||||
bool match = true; // return value
|
||||
bool match = true; /* return value */
|
||||
|
||||
if (dest->mac_len != src->mac_len)
|
||||
match = false;
|
||||
|
||||
+30
-30
@@ -93,8 +93,8 @@ static BACNET_SERVICES_SUPPORTED
|
||||
SERVICE_SUPPORTED_UTC_TIME_SYNCHRONIZATION
|
||||
};
|
||||
|
||||
// Confirmed Function Handlers
|
||||
// If they are not set, they are handled by a reject message
|
||||
/* Confirmed Function Handlers */
|
||||
/* If they are not set, they are handled by a reject message */
|
||||
static confirmed_function Confirmed_Function[MAX_BACNET_CONFIRMED_SERVICE];
|
||||
|
||||
void apdu_set_confirmed_handler(BACNET_CONFIRMED_SERVICE service_choice,
|
||||
@@ -146,7 +146,7 @@ bool apdu_service_supported(BACNET_SERVICES_SUPPORTED service_supported)
|
||||
return status;
|
||||
}
|
||||
|
||||
// Allow the APDU handler to automatically reject
|
||||
/* Allow the APDU handler to automatically reject */
|
||||
static confirmed_function Unrecognized_Service_Handler;
|
||||
|
||||
void apdu_set_unrecognized_service_handler_handler(confirmed_function
|
||||
@@ -155,8 +155,8 @@ void apdu_set_unrecognized_service_handler_handler(confirmed_function
|
||||
Unrecognized_Service_Handler = pFunction;
|
||||
}
|
||||
|
||||
// Unconfirmed Function Handlers
|
||||
// If they are not set, they are not handled
|
||||
/* Unconfirmed Function Handlers */
|
||||
/* If they are not set, they are not handled */
|
||||
static unconfirmed_function
|
||||
Unconfirmed_Function[MAX_BACNET_UNCONFIRMED_SERVICE] = {
|
||||
NULL
|
||||
@@ -180,7 +180,7 @@ bool apdu_unconfirmed_handler(BACNET_UNCONFIRMED_SERVICE service_choice)
|
||||
return status;
|
||||
}
|
||||
|
||||
// Confirmed ACK Function Handlers
|
||||
/* Confirmed ACK Function Handlers */
|
||||
static void *Confirmed_ACK_Function[MAX_BACNET_CONFIRMED_SERVICE];
|
||||
|
||||
void apdu_set_confirmed_simple_ack_handler(BACNET_CONFIRMED_SERVICE
|
||||
@@ -193,19 +193,19 @@ void apdu_set_confirmed_simple_ack_handler(BACNET_CONFIRMED_SERVICE
|
||||
case SERVICE_CONFIRMED_SUBSCRIBE_COV:
|
||||
case SERVICE_CONFIRMED_SUBSCRIBE_COV_PROPERTY:
|
||||
case SERVICE_CONFIRMED_LIFE_SAFETY_OPERATION:
|
||||
// Object Access Services
|
||||
/* Object Access Services */
|
||||
case SERVICE_CONFIRMED_ADD_LIST_ELEMENT:
|
||||
case SERVICE_CONFIRMED_REMOVE_LIST_ELEMENT:
|
||||
case SERVICE_CONFIRMED_DELETE_OBJECT:
|
||||
case SERVICE_CONFIRMED_WRITE_PROPERTY:
|
||||
case SERVICE_CONFIRMED_WRITE_PROPERTY_MULTIPLE:
|
||||
// Remote Device Management Services
|
||||
/* Remote Device Management Services */
|
||||
case SERVICE_CONFIRMED_DEVICE_COMMUNICATION_CONTROL:
|
||||
case SERVICE_CONFIRMED_TEXT_MESSAGE:
|
||||
case SERVICE_CONFIRMED_REINITIALIZE_DEVICE:
|
||||
// Virtual Terminal Services
|
||||
/* Virtual Terminal Services */
|
||||
case SERVICE_CONFIRMED_VT_CLOSE:
|
||||
// Security Services
|
||||
/* Security Services */
|
||||
case SERVICE_CONFIRMED_REQUEST_KEY:
|
||||
Confirmed_ACK_Function[service_choice] = (void *) pFunction;
|
||||
break;
|
||||
@@ -221,21 +221,21 @@ void apdu_set_confirmed_ack_handler(BACNET_CONFIRMED_SERVICE
|
||||
case SERVICE_CONFIRMED_GET_ALARM_SUMMARY:
|
||||
case SERVICE_CONFIRMED_GET_ENROLLMENT_SUMMARY:
|
||||
case SERVICE_CONFIRMED_GET_EVENT_INFORMATION:
|
||||
// File Access Services
|
||||
/* File Access Services */
|
||||
case SERVICE_CONFIRMED_ATOMIC_READ_FILE:
|
||||
case SERVICE_CONFIRMED_ATOMIC_WRITE_FILE:
|
||||
// Object Access Services
|
||||
/* Object Access Services */
|
||||
case SERVICE_CONFIRMED_CREATE_OBJECT:
|
||||
case SERVICE_CONFIRMED_READ_PROPERTY:
|
||||
case SERVICE_CONFIRMED_READ_PROPERTY_CONDITIONAL:
|
||||
case SERVICE_CONFIRMED_READ_PROPERTY_MULTIPLE:
|
||||
case SERVICE_CONFIRMED_READ_RANGE:
|
||||
// Remote Device Management Services
|
||||
/* Remote Device Management Services */
|
||||
case SERVICE_CONFIRMED_PRIVATE_TRANSFER:
|
||||
// Virtual Terminal Services
|
||||
/* Virtual Terminal Services */
|
||||
case SERVICE_CONFIRMED_VT_OPEN:
|
||||
case SERVICE_CONFIRMED_VT_DATA:
|
||||
// Security Services
|
||||
/* Security Services */
|
||||
case SERVICE_CONFIRMED_AUTHENTICATE:
|
||||
Confirmed_ACK_Function[service_choice] = (void *) pFunction;
|
||||
break;
|
||||
@@ -267,13 +267,13 @@ void apdu_set_reject_handler(reject_function pFunction)
|
||||
Reject_Function = pFunction;
|
||||
}
|
||||
|
||||
uint16_t apdu_decode_confirmed_service_request(uint8_t * apdu, // APDU data
|
||||
uint16_t apdu_decode_confirmed_service_request(uint8_t * apdu, /* APDU data */
|
||||
uint16_t apdu_len,
|
||||
BACNET_CONFIRMED_SERVICE_DATA * service_data,
|
||||
uint8_t * service_choice,
|
||||
uint8_t ** service_request, uint16_t * service_request_len)
|
||||
{
|
||||
uint16_t len = 0; // counts where we are in PDU
|
||||
uint16_t len = 0; /* counts where we are in PDU */
|
||||
|
||||
service_data->segmented_message = (apdu[0] & BIT3) ? true : false;
|
||||
service_data->more_follows = (apdu[0] & BIT2) ? true : false;
|
||||
@@ -294,8 +294,8 @@ uint16_t apdu_decode_confirmed_service_request(uint8_t * apdu, // APDU data
|
||||
return len;
|
||||
}
|
||||
|
||||
void apdu_handler(BACNET_ADDRESS * src, // source address
|
||||
bool data_expecting_reply, uint8_t * apdu, // APDU data
|
||||
void apdu_handler(BACNET_ADDRESS * src, /* source address */
|
||||
bool data_expecting_reply, uint8_t * apdu, /* APDU data */
|
||||
uint16_t apdu_len)
|
||||
{
|
||||
BACNET_CONFIRMED_SERVICE_DATA service_data = { 0 };
|
||||
@@ -304,7 +304,7 @@ void apdu_handler(BACNET_ADDRESS * src, // source address
|
||||
uint8_t service_choice = 0;
|
||||
uint8_t *service_request = NULL;
|
||||
uint16_t service_request_len = 0;
|
||||
uint16_t len = 0; // counts where we are in PDU
|
||||
uint16_t len = 0; /* counts where we are in PDU */
|
||||
uint8_t tag_number = 0;
|
||||
uint32_t len_value = 0;
|
||||
int error_code = 0;
|
||||
@@ -313,10 +313,10 @@ void apdu_handler(BACNET_ADDRESS * src, // source address
|
||||
|
||||
(void) data_expecting_reply;
|
||||
if (apdu) {
|
||||
// PDU Type
|
||||
/* PDU Type */
|
||||
switch (apdu[0] & 0xF0) {
|
||||
case PDU_TYPE_CONFIRMED_SERVICE_REQUEST:
|
||||
len = apdu_decode_confirmed_service_request(&apdu[0], // APDU data
|
||||
len = apdu_decode_confirmed_service_request(&apdu[0], /* APDU data */
|
||||
apdu_len,
|
||||
&service_data,
|
||||
&service_choice, &service_request, &service_request_len);
|
||||
@@ -359,19 +359,19 @@ void apdu_handler(BACNET_ADDRESS * src, // source address
|
||||
case SERVICE_CONFIRMED_SUBSCRIBE_COV:
|
||||
case SERVICE_CONFIRMED_SUBSCRIBE_COV_PROPERTY:
|
||||
case SERVICE_CONFIRMED_LIFE_SAFETY_OPERATION:
|
||||
// Object Access Services
|
||||
/* Object Access Services */
|
||||
case SERVICE_CONFIRMED_ADD_LIST_ELEMENT:
|
||||
case SERVICE_CONFIRMED_REMOVE_LIST_ELEMENT:
|
||||
case SERVICE_CONFIRMED_DELETE_OBJECT:
|
||||
case SERVICE_CONFIRMED_WRITE_PROPERTY:
|
||||
case SERVICE_CONFIRMED_WRITE_PROPERTY_MULTIPLE:
|
||||
// Remote Device Management Services
|
||||
/* Remote Device Management Services */
|
||||
case SERVICE_CONFIRMED_DEVICE_COMMUNICATION_CONTROL:
|
||||
case SERVICE_CONFIRMED_REINITIALIZE_DEVICE:
|
||||
case SERVICE_CONFIRMED_TEXT_MESSAGE:
|
||||
// Virtual Terminal Services
|
||||
/* Virtual Terminal Services */
|
||||
case SERVICE_CONFIRMED_VT_CLOSE:
|
||||
// Security Services
|
||||
/* Security Services */
|
||||
case SERVICE_CONFIRMED_REQUEST_KEY:
|
||||
if (Confirmed_ACK_Function[service_choice]) {
|
||||
((confirmed_simple_ack_function)
|
||||
@@ -402,20 +402,20 @@ void apdu_handler(BACNET_ADDRESS * src, // source address
|
||||
case SERVICE_CONFIRMED_GET_ALARM_SUMMARY:
|
||||
case SERVICE_CONFIRMED_GET_ENROLLMENT_SUMMARY:
|
||||
case SERVICE_CONFIRMED_GET_EVENT_INFORMATION:
|
||||
// File Access Services
|
||||
/* File Access Services */
|
||||
case SERVICE_CONFIRMED_ATOMIC_READ_FILE:
|
||||
case SERVICE_CONFIRMED_ATOMIC_WRITE_FILE:
|
||||
// Object Access Services
|
||||
/* Object Access Services */
|
||||
case SERVICE_CONFIRMED_CREATE_OBJECT:
|
||||
case SERVICE_CONFIRMED_READ_PROPERTY:
|
||||
case SERVICE_CONFIRMED_READ_PROPERTY_CONDITIONAL:
|
||||
case SERVICE_CONFIRMED_READ_PROPERTY_MULTIPLE:
|
||||
case SERVICE_CONFIRMED_READ_RANGE:
|
||||
case SERVICE_CONFIRMED_PRIVATE_TRANSFER:
|
||||
// Virtual Terminal Services
|
||||
/* Virtual Terminal Services */
|
||||
case SERVICE_CONFIRMED_VT_OPEN:
|
||||
case SERVICE_CONFIRMED_VT_DATA:
|
||||
// Security Services
|
||||
/* Security Services */
|
||||
case SERVICE_CONFIRMED_AUTHENTICATE:
|
||||
if (Confirmed_ACK_Function[service_choice]) {
|
||||
((confirmed_ack_function)
|
||||
|
||||
+32
-32
@@ -62,56 +62,56 @@ extern "C" {
|
||||
uint8_t proposed_window_number;
|
||||
} BACNET_CONFIRMED_SERVICE_ACK_DATA;
|
||||
|
||||
// generic unconfirmed function handler
|
||||
// Suitable to handle the following services:
|
||||
// I_Am, Who_Is, Unconfirmed_COV_Notification, I_Have,
|
||||
// Unconfirmed_Event_Notification, Unconfirmed_Private_Transfer,
|
||||
// Unconfirmed_Text_Message, Time_Synchronization, Who_Has,
|
||||
// UTC_Time_Synchronization
|
||||
/* generic unconfirmed function handler */
|
||||
/* Suitable to handle the following services: */
|
||||
/* I_Am, Who_Is, Unconfirmed_COV_Notification, I_Have, */
|
||||
/* Unconfirmed_Event_Notification, Unconfirmed_Private_Transfer, */
|
||||
/* Unconfirmed_Text_Message, Time_Synchronization, Who_Has, */
|
||||
/* UTC_Time_Synchronization */
|
||||
typedef void (*unconfirmed_function) (uint8_t * service_request,
|
||||
uint16_t len, BACNET_ADDRESS * src);
|
||||
|
||||
// generic confirmed function handler
|
||||
// Suitable to handle the following services:
|
||||
// Acknowledge_Alarm, Confirmed_COV_Notification,
|
||||
// Confirmed_Event_Notification, Get_Alarm_Summary,
|
||||
// Get_Enrollment_Summary_Handler, Get_Event_Information,
|
||||
// Subscribe_COV_Handler, Subscribe_COV_Property,
|
||||
// Life_Safety_Operation, Atomic_Read_File,
|
||||
// Confirmed_Atomic_Write_File, Add_List_Element,
|
||||
// Remove_List_Element, Create_Object_Handler,
|
||||
// Delete_Object_Handler, Read_Property,
|
||||
// Read_Property_Conditional, Read_Property_Multiple, Read_Range,
|
||||
// Write_Property, Write_Property_Multiple,
|
||||
// Device_Communication_Control, Confirmed_Private_Transfer,
|
||||
// Confirmed_Text_Message, Reinitialize_Device,
|
||||
// VT_Open, VT_Close, VT_Data_Handler,
|
||||
// Authenticate, Request_Key
|
||||
/* generic confirmed function handler */
|
||||
/* Suitable to handle the following services: */
|
||||
/* Acknowledge_Alarm, Confirmed_COV_Notification, */
|
||||
/* Confirmed_Event_Notification, Get_Alarm_Summary, */
|
||||
/* Get_Enrollment_Summary_Handler, Get_Event_Information, */
|
||||
/* Subscribe_COV_Handler, Subscribe_COV_Property, */
|
||||
/* Life_Safety_Operation, Atomic_Read_File, */
|
||||
/* Confirmed_Atomic_Write_File, Add_List_Element, */
|
||||
/* Remove_List_Element, Create_Object_Handler, */
|
||||
/* Delete_Object_Handler, Read_Property, */
|
||||
/* Read_Property_Conditional, Read_Property_Multiple, Read_Range, */
|
||||
/* Write_Property, Write_Property_Multiple, */
|
||||
/* Device_Communication_Control, Confirmed_Private_Transfer, */
|
||||
/* Confirmed_Text_Message, Reinitialize_Device, */
|
||||
/* VT_Open, VT_Close, VT_Data_Handler, */
|
||||
/* Authenticate, Request_Key */
|
||||
typedef void (*confirmed_function) (uint8_t * service_request,
|
||||
uint16_t service_len,
|
||||
BACNET_ADDRESS * src,
|
||||
BACNET_CONFIRMED_SERVICE_DATA * service_data);
|
||||
|
||||
// generic confirmed simple ack function handler
|
||||
/* generic confirmed simple ack function handler */
|
||||
typedef void (*confirmed_simple_ack_function) (BACNET_ADDRESS * src,
|
||||
uint8_t invoke_id);
|
||||
|
||||
// generic confirmed ack function handler
|
||||
/* generic confirmed ack function handler */
|
||||
typedef void (*confirmed_ack_function) (uint8_t * service_request,
|
||||
uint16_t service_len,
|
||||
BACNET_ADDRESS * src,
|
||||
BACNET_CONFIRMED_SERVICE_ACK_DATA * service_data);
|
||||
|
||||
// generic error reply function
|
||||
/* generic error reply function */
|
||||
typedef void (*error_function) (BACNET_ADDRESS * src,
|
||||
uint8_t invoke_id,
|
||||
BACNET_ERROR_CLASS error_class, BACNET_ERROR_CODE error_code);
|
||||
|
||||
// generic abort reply function
|
||||
/* generic abort reply function */
|
||||
typedef void (*abort_function) (BACNET_ADDRESS * src,
|
||||
uint8_t invoke_id, uint8_t abort_reason);
|
||||
|
||||
// generic reject reply function
|
||||
/* generic reject reply function */
|
||||
typedef void (*reject_function) (BACNET_ADDRESS * src,
|
||||
uint8_t invoke_id, uint8_t reject_reason);
|
||||
|
||||
@@ -121,7 +121,7 @@ extern "C" {
|
||||
void apdu_set_confirmed_simple_ack_handler(BACNET_CONFIRMED_SERVICE
|
||||
service_choice, confirmed_simple_ack_function pFunction);
|
||||
|
||||
// configure reject for confirmed services that are not supported
|
||||
/* configure reject for confirmed services that are not supported */
|
||||
void apdu_set_unrecognized_service_handler_handler(confirmed_function
|
||||
pFunction);
|
||||
|
||||
@@ -149,15 +149,15 @@ extern "C" {
|
||||
|
||||
void apdu_set_reject_handler(reject_function pFunction);
|
||||
|
||||
uint16_t apdu_decode_confirmed_service_request(uint8_t * apdu, // APDU data
|
||||
uint16_t apdu_decode_confirmed_service_request(uint8_t * apdu, /* APDU data */
|
||||
uint16_t apdu_len,
|
||||
BACNET_CONFIRMED_SERVICE_DATA * service_data,
|
||||
uint8_t * service_choice,
|
||||
uint8_t ** service_request, uint16_t * service_request_len);
|
||||
|
||||
void apdu_handler(BACNET_ADDRESS * src, // source address
|
||||
bool data_expecting_reply, uint8_t * apdu, // APDU data
|
||||
uint16_t pdu_len); // for confirmed messages
|
||||
void apdu_handler(BACNET_ADDRESS * src, /* source address */
|
||||
bool data_expecting_reply, uint8_t * apdu, /* APDU data */
|
||||
uint16_t pdu_len); /* for confirmed messages */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
+15
-15
@@ -39,7 +39,7 @@
|
||||
#include <stddef.h>
|
||||
#include "bacdef.h"
|
||||
|
||||
// specific defines for ARCNET
|
||||
/* specific defines for ARCNET */
|
||||
#define MAX_HEADER (1+1+2+2+1+1+1+1)
|
||||
#define MAX_MPDU (MAX_HEADER+MAX_PDU)
|
||||
|
||||
@@ -53,26 +53,26 @@ extern "C" {
|
||||
|
||||
/* function to send a packet out the 802.2 socket */
|
||||
/* returns 0 on success, non-zero on failure */
|
||||
int arcnet_send(BACNET_ADDRESS * dest, // destination address
|
||||
BACNET_ADDRESS * src, // source address
|
||||
uint8_t * pdu, // any data to be sent - may be null
|
||||
unsigned pdu_len); // number of bytes of data
|
||||
int arcnet_send(BACNET_ADDRESS * dest, /* destination address */
|
||||
BACNET_ADDRESS * src, /* source address */
|
||||
uint8_t * pdu, /* any data to be sent - may be null */
|
||||
unsigned pdu_len); /* number of bytes of data */
|
||||
|
||||
/* function to send a packet out the 802.2 socket */
|
||||
/* returns zero on success, non-zero on failure */
|
||||
int arcnet_send_pdu(BACNET_ADDRESS * dest, // destination address
|
||||
uint8_t * pdu, // any data to be sent - may be null
|
||||
unsigned pdu_len); // number of bytes of data
|
||||
int arcnet_send_pdu(BACNET_ADDRESS * dest, /* destination address */
|
||||
uint8_t * pdu, /* any data to be sent - may be null */
|
||||
unsigned pdu_len); /* number of bytes of data */
|
||||
|
||||
// receives an framed packet
|
||||
// returns the number of octets in the PDU, or zero on failure
|
||||
uint16_t arcnet_receive(BACNET_ADDRESS * src, // source address
|
||||
uint8_t * pdu, // PDU data
|
||||
uint16_t max_pdu, // amount of space available in the PDU
|
||||
unsigned timeout); // milliseconds to wait for a packet
|
||||
/* receives an framed packet */
|
||||
/* returns the number of octets in the PDU, or zero on failure */
|
||||
uint16_t arcnet_receive(BACNET_ADDRESS * src, /* source address */
|
||||
uint8_t * pdu, /* PDU data */
|
||||
uint16_t max_pdu, /* amount of space available in the PDU */
|
||||
unsigned timeout); /* milliseconds to wait for a packet */
|
||||
|
||||
void arcnet_get_my_address(BACNET_ADDRESS * my_address);
|
||||
void arcnet_get_broadcast_address(BACNET_ADDRESS * dest); // destination address
|
||||
void arcnet_get_broadcast_address(BACNET_ADDRESS * dest); /* destination address */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
+33
-33
@@ -38,20 +38,20 @@
|
||||
#include "device.h"
|
||||
#include "arf.h"
|
||||
|
||||
// Atomic Read File
|
||||
/* Atomic Read File */
|
||||
|
||||
// encode service
|
||||
/* encode service */
|
||||
int arf_encode_apdu(uint8_t * apdu,
|
||||
uint8_t invoke_id, BACNET_ATOMIC_READ_FILE_DATA * data)
|
||||
{
|
||||
int apdu_len = 0; // total length of the apdu, return value
|
||||
int apdu_len = 0; /* total length of the apdu, return value */
|
||||
|
||||
if (apdu) {
|
||||
apdu[0] = PDU_TYPE_CONFIRMED_SERVICE_REQUEST;
|
||||
apdu[1] =
|
||||
encode_max_segs_max_apdu(0, Device_Max_APDU_Length_Accepted());
|
||||
apdu[2] = invoke_id;
|
||||
apdu[3] = SERVICE_CONFIRMED_ATOMIC_READ_FILE; // service choice
|
||||
apdu[3] = SERVICE_CONFIRMED_ATOMIC_READ_FILE; /* service choice */
|
||||
apdu_len = 4;
|
||||
apdu_len += encode_tagged_object_id(&apdu[apdu_len],
|
||||
data->object_type, data->object_instance);
|
||||
@@ -80,7 +80,7 @@ int arf_encode_apdu(uint8_t * apdu,
|
||||
return apdu_len;
|
||||
}
|
||||
|
||||
// decode the service request only
|
||||
/* decode the service request only */
|
||||
int arf_decode_service_request(uint8_t * apdu,
|
||||
unsigned apdu_len, BACNET_ATOMIC_READ_FILE_DATA * data)
|
||||
{
|
||||
@@ -88,9 +88,9 @@ int arf_decode_service_request(uint8_t * apdu,
|
||||
int tag_len = 0;
|
||||
uint8_t tag_number = 0;
|
||||
uint32_t len_value_type = 0;
|
||||
int type = 0; // for decoding
|
||||
int type = 0; /* for decoding */
|
||||
|
||||
// check for value pointers
|
||||
/* check for value pointers */
|
||||
if (apdu_len && data) {
|
||||
len =
|
||||
decode_tag_number_and_value(&apdu[0], &tag_number,
|
||||
@@ -101,9 +101,9 @@ int arf_decode_service_request(uint8_t * apdu,
|
||||
data->object_type = type;
|
||||
if (decode_is_opening_tag_number(&apdu[len], 0)) {
|
||||
data->access = FILE_STREAM_ACCESS;
|
||||
// a tag number is not extended so only one octet
|
||||
/* a tag number is not extended so only one octet */
|
||||
len++;
|
||||
// fileStartPosition
|
||||
/* fileStartPosition */
|
||||
tag_len = decode_tag_number_and_value(&apdu[len],
|
||||
&tag_number, &len_value_type);
|
||||
len += tag_len;
|
||||
@@ -111,7 +111,7 @@ int arf_decode_service_request(uint8_t * apdu,
|
||||
return -1;
|
||||
len += decode_signed(&apdu[len],
|
||||
len_value_type, &data->type.stream.fileStartPosition);
|
||||
// requestedOctetCount
|
||||
/* requestedOctetCount */
|
||||
tag_len = decode_tag_number_and_value(&apdu[len],
|
||||
&tag_number, &len_value_type);
|
||||
len += tag_len;
|
||||
@@ -121,13 +121,13 @@ int arf_decode_service_request(uint8_t * apdu,
|
||||
len_value_type, &data->type.stream.requestedOctetCount);
|
||||
if (!decode_is_closing_tag_number(&apdu[len], 0))
|
||||
return -1;
|
||||
// a tag number is not extended so only one octet
|
||||
/* a tag number is not extended so only one octet */
|
||||
len++;
|
||||
} else if (decode_is_opening_tag_number(&apdu[len], 1)) {
|
||||
data->access = FILE_RECORD_ACCESS;
|
||||
// a tag number is not extended so only one octet
|
||||
/* a tag number is not extended so only one octet */
|
||||
len++;
|
||||
// fileStartRecord
|
||||
/* fileStartRecord */
|
||||
tag_len = decode_tag_number_and_value(&apdu[len],
|
||||
&tag_number, &len_value_type);
|
||||
len += tag_len;
|
||||
@@ -135,7 +135,7 @@ int arf_decode_service_request(uint8_t * apdu,
|
||||
return -1;
|
||||
len += decode_signed(&apdu[len],
|
||||
len_value_type, &data->type.record.fileStartRecord);
|
||||
// RecordCount
|
||||
/* RecordCount */
|
||||
tag_len = decode_tag_number_and_value(&apdu[len],
|
||||
&tag_number, &len_value_type);
|
||||
len += tag_len;
|
||||
@@ -145,7 +145,7 @@ int arf_decode_service_request(uint8_t * apdu,
|
||||
len_value_type, &data->type.record.RecordCount);
|
||||
if (!decode_is_closing_tag_number(&apdu[len], 1))
|
||||
return -1;
|
||||
// a tag number is not extended so only one octet
|
||||
/* a tag number is not extended so only one octet */
|
||||
len++;
|
||||
} else
|
||||
return -1;
|
||||
@@ -163,10 +163,10 @@ int arf_decode_apdu(uint8_t * apdu,
|
||||
|
||||
if (!apdu)
|
||||
return -1;
|
||||
// optional checking - most likely was already done prior to this call
|
||||
/* optional checking - most likely was already done prior to this call */
|
||||
if (apdu[0] != PDU_TYPE_CONFIRMED_SERVICE_REQUEST)
|
||||
return -1;
|
||||
// apdu[1] = encode_max_segs_max_apdu(0, Device_Max_APDU_Length_Accepted());
|
||||
/* apdu[1] = encode_max_segs_max_apdu(0, Device_Max_APDU_Length_Accepted()); */
|
||||
*invoke_id = apdu[2]; /* invoke id - filled in by net layer */
|
||||
if (apdu[3] != SERVICE_CONFIRMED_ATOMIC_READ_FILE)
|
||||
return -1;
|
||||
@@ -180,18 +180,18 @@ int arf_decode_apdu(uint8_t * apdu,
|
||||
return len;
|
||||
}
|
||||
|
||||
// encode service
|
||||
/* encode service */
|
||||
int arf_ack_encode_apdu(uint8_t * apdu,
|
||||
uint8_t invoke_id, BACNET_ATOMIC_READ_FILE_DATA * data)
|
||||
{
|
||||
int apdu_len = 0; // total length of the apdu, return value
|
||||
int apdu_len = 0; /* total length of the apdu, return value */
|
||||
|
||||
if (apdu) {
|
||||
apdu[0] = PDU_TYPE_COMPLEX_ACK;
|
||||
apdu[1] = invoke_id;
|
||||
apdu[2] = SERVICE_CONFIRMED_ATOMIC_READ_FILE; // service choice
|
||||
apdu[2] = SERVICE_CONFIRMED_ATOMIC_READ_FILE; /* service choice */
|
||||
apdu_len = 3;
|
||||
// endOfFile
|
||||
/* endOfFile */
|
||||
apdu_len +=
|
||||
encode_tagged_boolean(&apdu[apdu_len], data->endOfFile);
|
||||
switch (data->access) {
|
||||
@@ -221,7 +221,7 @@ int arf_ack_encode_apdu(uint8_t * apdu,
|
||||
return apdu_len;
|
||||
}
|
||||
|
||||
// decode the service request only
|
||||
/* decode the service request only */
|
||||
int arf_ack_decode_service_request(uint8_t * apdu,
|
||||
unsigned apdu_len, BACNET_ATOMIC_READ_FILE_DATA * data)
|
||||
{
|
||||
@@ -230,7 +230,7 @@ int arf_ack_decode_service_request(uint8_t * apdu,
|
||||
uint8_t tag_number = 0;
|
||||
uint32_t len_value_type = 0;
|
||||
|
||||
// check for value pointers
|
||||
/* check for value pointers */
|
||||
if (apdu_len && data) {
|
||||
len =
|
||||
decode_tag_number_and_value(&apdu[0], &tag_number,
|
||||
@@ -240,9 +240,9 @@ int arf_ack_decode_service_request(uint8_t * apdu,
|
||||
data->endOfFile = decode_boolean(len_value_type);
|
||||
if (decode_is_opening_tag_number(&apdu[len], 0)) {
|
||||
data->access = FILE_STREAM_ACCESS;
|
||||
// a tag number is not extended so only one octet
|
||||
/* a tag number is not extended so only one octet */
|
||||
len++;
|
||||
// fileStartPosition
|
||||
/* fileStartPosition */
|
||||
tag_len = decode_tag_number_and_value(&apdu[len],
|
||||
&tag_number, &len_value_type);
|
||||
len += tag_len;
|
||||
@@ -250,7 +250,7 @@ int arf_ack_decode_service_request(uint8_t * apdu,
|
||||
return -1;
|
||||
len += decode_signed(&apdu[len],
|
||||
len_value_type, &data->type.stream.fileStartPosition);
|
||||
// fileData
|
||||
/* fileData */
|
||||
tag_len = decode_tag_number_and_value(&apdu[len],
|
||||
&tag_number, &len_value_type);
|
||||
len += tag_len;
|
||||
@@ -260,13 +260,13 @@ int arf_ack_decode_service_request(uint8_t * apdu,
|
||||
len_value_type, &data->fileData);
|
||||
if (!decode_is_closing_tag_number(&apdu[len], 0))
|
||||
return -1;
|
||||
// a tag number is not extended so only one octet
|
||||
/* a tag number is not extended so only one octet */
|
||||
len++;
|
||||
} else if (decode_is_opening_tag_number(&apdu[len], 1)) {
|
||||
data->access = FILE_RECORD_ACCESS;
|
||||
// a tag number is not extended so only one octet
|
||||
/* a tag number is not extended so only one octet */
|
||||
len++;
|
||||
// fileStartRecord
|
||||
/* fileStartRecord */
|
||||
tag_len = decode_tag_number_and_value(&apdu[len],
|
||||
&tag_number, &len_value_type);
|
||||
len += tag_len;
|
||||
@@ -274,7 +274,7 @@ int arf_ack_decode_service_request(uint8_t * apdu,
|
||||
return -1;
|
||||
len += decode_signed(&apdu[len],
|
||||
len_value_type, &data->type.record.fileStartRecord);
|
||||
// returnedRecordCount
|
||||
/* returnedRecordCount */
|
||||
tag_len = decode_tag_number_and_value(&apdu[len],
|
||||
&tag_number, &len_value_type);
|
||||
len += tag_len;
|
||||
@@ -282,7 +282,7 @@ int arf_ack_decode_service_request(uint8_t * apdu,
|
||||
return -1;
|
||||
len += decode_unsigned(&apdu[len],
|
||||
len_value_type, &data->type.record.RecordCount);
|
||||
// fileData
|
||||
/* fileData */
|
||||
tag_len = decode_tag_number_and_value(&apdu[len],
|
||||
&tag_number, &len_value_type);
|
||||
len += tag_len;
|
||||
@@ -292,7 +292,7 @@ int arf_ack_decode_service_request(uint8_t * apdu,
|
||||
len_value_type, &data->fileData);
|
||||
if (!decode_is_closing_tag_number(&apdu[len], 1))
|
||||
return -1;
|
||||
// a tag number is not extended so only one octet
|
||||
/* a tag number is not extended so only one octet */
|
||||
len++;
|
||||
} else
|
||||
return -1;
|
||||
@@ -310,7 +310,7 @@ int arf_ack_decode_apdu(uint8_t * apdu,
|
||||
|
||||
if (!apdu)
|
||||
return -1;
|
||||
// optional checking - most likely was already done prior to this call
|
||||
/* optional checking - most likely was already done prior to this call */
|
||||
if (apdu[0] != PDU_TYPE_COMPLEX_ACK)
|
||||
return -1;
|
||||
*invoke_id = apdu[1]; /* invoke id - filled in by net layer */
|
||||
|
||||
+7
-7
@@ -50,7 +50,7 @@ typedef struct BACnet_Atomic_Read_File_Data {
|
||||
} stream;
|
||||
struct {
|
||||
int32_t fileStartRecord;
|
||||
// requested or returned record count
|
||||
/* requested or returned record count */
|
||||
uint32_t RecordCount;
|
||||
} record;
|
||||
} type;
|
||||
@@ -62,12 +62,12 @@ typedef struct BACnet_Atomic_Read_File_Data {
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
// Atomic Read File
|
||||
// encode service
|
||||
/* Atomic Read File */
|
||||
/* encode service */
|
||||
int arf_encode_apdu(uint8_t * apdu,
|
||||
uint8_t invoke_id, BACNET_ATOMIC_READ_FILE_DATA * data);
|
||||
|
||||
// decode the service request only
|
||||
/* decode the service request only */
|
||||
int arf_decode_service_request(uint8_t * apdu,
|
||||
unsigned apdu_len, BACNET_ATOMIC_READ_FILE_DATA * data);
|
||||
|
||||
@@ -75,13 +75,13 @@ extern "C" {
|
||||
unsigned apdu_len,
|
||||
uint8_t * invoke_id, BACNET_ATOMIC_READ_FILE_DATA * data);
|
||||
|
||||
// Atomic Read File Ack
|
||||
/* Atomic Read File Ack */
|
||||
|
||||
// encode service
|
||||
/* encode service */
|
||||
int arf_ack_encode_apdu(uint8_t * apdu,
|
||||
uint8_t invoke_id, BACNET_ATOMIC_READ_FILE_DATA * data);
|
||||
|
||||
// decode the service request only
|
||||
/* decode the service request only */
|
||||
int arf_ack_decode_service_request(uint8_t * apdu,
|
||||
unsigned apdu_len, BACNET_ATOMIC_READ_FILE_DATA * data);
|
||||
|
||||
|
||||
+23
-23
@@ -38,20 +38,20 @@
|
||||
#include "device.h"
|
||||
#include "awf.h"
|
||||
|
||||
// Atomic Write File
|
||||
/* Atomic Write File */
|
||||
|
||||
// encode service
|
||||
/* encode service */
|
||||
int awf_encode_apdu(uint8_t * apdu,
|
||||
uint8_t invoke_id, BACNET_ATOMIC_WRITE_FILE_DATA * data)
|
||||
{
|
||||
int apdu_len = 0; // total length of the apdu, return value
|
||||
int apdu_len = 0; /* total length of the apdu, return value */
|
||||
|
||||
if (apdu) {
|
||||
apdu[0] = PDU_TYPE_CONFIRMED_SERVICE_REQUEST;
|
||||
apdu[1] =
|
||||
encode_max_segs_max_apdu(0, Device_Max_APDU_Length_Accepted());
|
||||
apdu[2] = invoke_id;
|
||||
apdu[3] = SERVICE_CONFIRMED_ATOMIC_WRITE_FILE; // service choice
|
||||
apdu[3] = SERVICE_CONFIRMED_ATOMIC_WRITE_FILE; /* service choice */
|
||||
apdu_len = 4;
|
||||
apdu_len += encode_tagged_object_id(&apdu[apdu_len],
|
||||
data->object_type, data->object_instance);
|
||||
@@ -82,7 +82,7 @@ int awf_encode_apdu(uint8_t * apdu,
|
||||
return apdu_len;
|
||||
}
|
||||
|
||||
// decode the service request only
|
||||
/* decode the service request only */
|
||||
int awf_decode_service_request(uint8_t * apdu,
|
||||
unsigned apdu_len, BACNET_ATOMIC_WRITE_FILE_DATA * data)
|
||||
{
|
||||
@@ -90,9 +90,9 @@ int awf_decode_service_request(uint8_t * apdu,
|
||||
int tag_len = 0;
|
||||
uint8_t tag_number = 0;
|
||||
uint32_t len_value_type = 0;
|
||||
int type = 0; // for decoding
|
||||
int type = 0; /* for decoding */
|
||||
|
||||
// check for value pointers
|
||||
/* check for value pointers */
|
||||
if (apdu_len && data) {
|
||||
len =
|
||||
decode_tag_number_and_value(&apdu[0], &tag_number,
|
||||
@@ -103,9 +103,9 @@ int awf_decode_service_request(uint8_t * apdu,
|
||||
data->object_type = type;
|
||||
if (decode_is_opening_tag_number(&apdu[len], 0)) {
|
||||
data->access = FILE_STREAM_ACCESS;
|
||||
// a tag number of 2 is not extended so only one octet
|
||||
/* a tag number of 2 is not extended so only one octet */
|
||||
len++;
|
||||
// fileStartPosition
|
||||
/* fileStartPosition */
|
||||
tag_len = decode_tag_number_and_value(&apdu[len],
|
||||
&tag_number, &len_value_type);
|
||||
len += tag_len;
|
||||
@@ -113,7 +113,7 @@ int awf_decode_service_request(uint8_t * apdu,
|
||||
return -1;
|
||||
len += decode_signed(&apdu[len],
|
||||
len_value_type, &data->type.stream.fileStartPosition);
|
||||
// fileData
|
||||
/* fileData */
|
||||
tag_len = decode_tag_number_and_value(&apdu[len],
|
||||
&tag_number, &len_value_type);
|
||||
len += tag_len;
|
||||
@@ -123,13 +123,13 @@ int awf_decode_service_request(uint8_t * apdu,
|
||||
len_value_type, &data->fileData);
|
||||
if (!decode_is_closing_tag_number(&apdu[len], 0))
|
||||
return -1;
|
||||
// a tag number is not extended so only one octet
|
||||
/* a tag number is not extended so only one octet */
|
||||
len++;
|
||||
} else if (decode_is_opening_tag_number(&apdu[len], 1)) {
|
||||
data->access = FILE_RECORD_ACCESS;
|
||||
// a tag number is not extended so only one octet
|
||||
/* a tag number is not extended so only one octet */
|
||||
len++;
|
||||
// fileStartRecord
|
||||
/* fileStartRecord */
|
||||
tag_len = decode_tag_number_and_value(&apdu[len],
|
||||
&tag_number, &len_value_type);
|
||||
len += tag_len;
|
||||
@@ -137,7 +137,7 @@ int awf_decode_service_request(uint8_t * apdu,
|
||||
return -1;
|
||||
len += decode_signed(&apdu[len],
|
||||
len_value_type, &data->type.record.fileStartRecord);
|
||||
// returnedRecordCount
|
||||
/* returnedRecordCount */
|
||||
tag_len = decode_tag_number_and_value(&apdu[len],
|
||||
&tag_number, &len_value_type);
|
||||
len += tag_len;
|
||||
@@ -145,7 +145,7 @@ int awf_decode_service_request(uint8_t * apdu,
|
||||
return -1;
|
||||
len += decode_unsigned(&apdu[len],
|
||||
len_value_type, &data->type.record.returnedRecordCount);
|
||||
// fileData
|
||||
/* fileData */
|
||||
tag_len = decode_tag_number_and_value(&apdu[len],
|
||||
&tag_number, &len_value_type);
|
||||
len += tag_len;
|
||||
@@ -155,7 +155,7 @@ int awf_decode_service_request(uint8_t * apdu,
|
||||
len_value_type, &data->fileData);
|
||||
if (!decode_is_closing_tag_number(&apdu[len], 1))
|
||||
return -1;
|
||||
// a tag number is not extended so only one octet
|
||||
/* a tag number is not extended so only one octet */
|
||||
len++;
|
||||
} else
|
||||
return -1;
|
||||
@@ -173,10 +173,10 @@ int awf_decode_apdu(uint8_t * apdu,
|
||||
|
||||
if (!apdu)
|
||||
return -1;
|
||||
// optional checking - most likely was already done prior to this call
|
||||
/* optional checking - most likely was already done prior to this call */
|
||||
if (apdu[0] != PDU_TYPE_CONFIRMED_SERVICE_REQUEST)
|
||||
return -1;
|
||||
// apdu[1] = encode_max_segs_max_apdu(0, Device_Max_APDU_Length_Accepted());
|
||||
/* apdu[1] = encode_max_segs_max_apdu(0, Device_Max_APDU_Length_Accepted()); */
|
||||
*invoke_id = apdu[2]; /* invoke id - filled in by net layer */
|
||||
if (apdu[3] != SERVICE_CONFIRMED_ATOMIC_WRITE_FILE)
|
||||
return -1;
|
||||
@@ -193,12 +193,12 @@ int awf_decode_apdu(uint8_t * apdu,
|
||||
int awf_ack_encode_apdu(uint8_t * apdu,
|
||||
uint8_t invoke_id, BACNET_ATOMIC_WRITE_FILE_DATA * data)
|
||||
{
|
||||
int apdu_len = 0; // total length of the apdu, return value
|
||||
int apdu_len = 0; /* total length of the apdu, return value */
|
||||
|
||||
if (apdu) {
|
||||
apdu[0] = PDU_TYPE_COMPLEX_ACK;
|
||||
apdu[1] = invoke_id;
|
||||
apdu[2] = SERVICE_CONFIRMED_ATOMIC_WRITE_FILE; // service choice
|
||||
apdu[2] = SERVICE_CONFIRMED_ATOMIC_WRITE_FILE; /* service choice */
|
||||
apdu_len = 3;
|
||||
switch (data->access) {
|
||||
case FILE_STREAM_ACCESS:
|
||||
@@ -217,7 +217,7 @@ int awf_ack_encode_apdu(uint8_t * apdu,
|
||||
return apdu_len;
|
||||
}
|
||||
|
||||
// decode the service request only
|
||||
/* decode the service request only */
|
||||
int awf_ack_decode_service_request(uint8_t * apdu,
|
||||
unsigned apdu_len, BACNET_ATOMIC_WRITE_FILE_DATA * data)
|
||||
{
|
||||
@@ -225,7 +225,7 @@ int awf_ack_decode_service_request(uint8_t * apdu,
|
||||
uint8_t tag_number = 0;
|
||||
uint32_t len_value_type = 0;
|
||||
|
||||
// check for value pointers
|
||||
/* check for value pointers */
|
||||
if (apdu_len && data) {
|
||||
len =
|
||||
decode_tag_number_and_value(&apdu[0], &tag_number,
|
||||
@@ -254,7 +254,7 @@ int awf_ack_decode_apdu(uint8_t * apdu,
|
||||
|
||||
if (!apdu)
|
||||
return -1;
|
||||
// optional checking - most likely was already done prior to this call
|
||||
/* optional checking - most likely was already done prior to this call */
|
||||
if (apdu[0] != PDU_TYPE_COMPLEX_ACK)
|
||||
return -1;
|
||||
*invoke_id = apdu[1]; /* invoke id - filled in by net layer */
|
||||
|
||||
+6
-6
@@ -58,12 +58,12 @@ typedef struct BACnet_Atomic_Write_File_Data {
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
// Atomic Write File
|
||||
// encode service
|
||||
/* Atomic Write File */
|
||||
/* encode service */
|
||||
int awf_encode_apdu(uint8_t * apdu,
|
||||
uint8_t invoke_id, BACNET_ATOMIC_WRITE_FILE_DATA * data);
|
||||
|
||||
// decode the service request only
|
||||
/* decode the service request only */
|
||||
int awf_decode_service_request(uint8_t * apdu,
|
||||
unsigned apdu_len, BACNET_ATOMIC_WRITE_FILE_DATA * data);
|
||||
|
||||
@@ -71,12 +71,12 @@ extern "C" {
|
||||
unsigned apdu_len,
|
||||
uint8_t * invoke_id, BACNET_ATOMIC_WRITE_FILE_DATA * data);
|
||||
|
||||
// Atomic Write File Ack
|
||||
// encode service
|
||||
/* Atomic Write File Ack */
|
||||
/* encode service */
|
||||
int awf_ack_encode_apdu(uint8_t * apdu,
|
||||
uint8_t invoke_id, BACNET_ATOMIC_WRITE_FILE_DATA * data);
|
||||
|
||||
// decode the service request only
|
||||
/* decode the service request only */
|
||||
int awf_ack_decode_service_request(uint8_t * apdu,
|
||||
unsigned apdu_len, BACNET_ATOMIC_WRITE_FILE_DATA * data);
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
int bacapp_encode_application_data(uint8_t * apdu,
|
||||
BACNET_APPLICATION_DATA_VALUE * value)
|
||||
{
|
||||
int apdu_len = 0; // total length of the apdu, return value
|
||||
int apdu_len = 0; /* total length of the apdu, return value */
|
||||
|
||||
if (apdu) {
|
||||
if (value->tag == BACNET_APPLICATION_TAG_NULL)
|
||||
|
||||
+215
-215
File diff suppressed because it is too large
Load Diff
+51
-51
@@ -44,54 +44,54 @@
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
// from clause 20.2.1 General Rules for Encoding BACnet Tags
|
||||
// returns the number of apdu bytes consumed
|
||||
/* from clause 20.2.1 General Rules for Encoding BACnet Tags */
|
||||
/* returns the number of apdu bytes consumed */
|
||||
int encode_tag(uint8_t * apdu, uint8_t tag_number,
|
||||
bool context_specific, uint32_t len_value_type);
|
||||
|
||||
// from clause 20.2.1.3.2 Constructed Data
|
||||
// returns the number of apdu bytes consumed
|
||||
/* from clause 20.2.1.3.2 Constructed Data */
|
||||
/* returns the number of apdu bytes consumed */
|
||||
int encode_opening_tag(uint8_t * apdu, uint8_t tag_number);
|
||||
int encode_closing_tag(uint8_t * apdu, uint8_t tag_number);
|
||||
int decode_tag_number_and_value(uint8_t * apdu, uint8_t * tag_number,
|
||||
uint32_t * value);
|
||||
// returns true if the tag is context specific
|
||||
/* returns true if the tag is context specific */
|
||||
bool decode_is_context_specific(uint8_t * apdu);
|
||||
// returns true if the tag is an opening tag and matches
|
||||
/* returns true if the tag is an opening tag and matches */
|
||||
bool decode_is_opening_tag_number(uint8_t * apdu, uint8_t tag_number);
|
||||
// returns true if the tag is a closing tag and matches
|
||||
/* returns true if the tag is a closing tag and matches */
|
||||
bool decode_is_closing_tag_number(uint8_t * apdu, uint8_t tag_number);
|
||||
// returns true if the tag is context specific and matches
|
||||
/* returns true if the tag is context specific and matches */
|
||||
bool decode_is_context_tag(uint8_t * apdu, uint8_t tag_number);
|
||||
|
||||
// from clause 20.2.2 Encoding of a Null Value
|
||||
/* from clause 20.2.2 Encoding of a Null Value */
|
||||
int encode_tagged_null(uint8_t * apdu);
|
||||
|
||||
// from clause 20.2.3 Encoding of a Boolean Value
|
||||
/* from clause 20.2.3 Encoding of a Boolean Value */
|
||||
int encode_tagged_boolean(uint8_t * apdu, bool boolean_value);
|
||||
bool decode_boolean(uint32_t len_value);
|
||||
int encode_context_boolean(uint8_t * apdu, bool boolean_value);
|
||||
bool decode_context_boolean(uint8_t * apdu);
|
||||
|
||||
// from clause 20.2.10 Encoding of a Bit String Value
|
||||
// returns the number of apdu bytes consumed
|
||||
/* from clause 20.2.10 Encoding of a Bit String Value */
|
||||
/* returns the number of apdu bytes consumed */
|
||||
int decode_bitstring(uint8_t * apdu, uint32_t len_value,
|
||||
BACNET_BIT_STRING * bit_string);
|
||||
// returns the number of apdu bytes consumed
|
||||
/* returns the number of apdu bytes consumed */
|
||||
int encode_bitstring(uint8_t * apdu, BACNET_BIT_STRING * bit_string);
|
||||
int encode_tagged_bitstring(uint8_t * apdu,
|
||||
BACNET_BIT_STRING * bit_string);
|
||||
|
||||
// from clause 20.2.6 Encoding of a Real Number Value
|
||||
// and 20.2.1 General Rules for Encoding BACnet Tags
|
||||
// returns the number of apdu bytes consumed
|
||||
/* from clause 20.2.6 Encoding of a Real Number Value */
|
||||
/* and 20.2.1 General Rules for Encoding BACnet Tags */
|
||||
/* returns the number of apdu bytes consumed */
|
||||
int decode_real(uint8_t * apdu, float *real_value);
|
||||
int encode_bacnet_real(float value, uint8_t * apdu);
|
||||
int encode_tagged_real(uint8_t * apdu, float value);
|
||||
|
||||
// from clause 20.2.14 Encoding of an Object Identifier Value
|
||||
// and 20.2.1 General Rules for Encoding BACnet Tags
|
||||
// returns the number of apdu bytes consumed
|
||||
/* from clause 20.2.14 Encoding of an Object Identifier Value */
|
||||
/* and 20.2.1 General Rules for Encoding BACnet Tags */
|
||||
/* returns the number of apdu bytes consumed */
|
||||
int decode_object_id(uint8_t * apdu, int *object_type,
|
||||
uint32_t * instance);
|
||||
int encode_bacnet_object_id(uint8_t * apdu, int object_type,
|
||||
@@ -101,9 +101,9 @@ extern "C" {
|
||||
int encode_tagged_object_id(uint8_t * apdu, int object_type,
|
||||
uint32_t instance);
|
||||
|
||||
// from clause 20.2.8 Encoding of an Octet String Value
|
||||
// and 20.2.1 General Rules for Encoding BACnet Tags
|
||||
// returns the number of apdu bytes consumed
|
||||
/* from clause 20.2.8 Encoding of an Octet String Value */
|
||||
/* and 20.2.1 General Rules for Encoding BACnet Tags */
|
||||
/* returns the number of apdu bytes consumed */
|
||||
int encode_octet_string(uint8_t * apdu,
|
||||
BACNET_OCTET_STRING * octet_string);
|
||||
int encode_tagged_octet_string(uint8_t * apdu,
|
||||
@@ -112,9 +112,9 @@ extern "C" {
|
||||
BACNET_OCTET_STRING * octet_string);
|
||||
|
||||
|
||||
// from clause 20.2.9 Encoding of a Character String Value
|
||||
// and 20.2.1 General Rules for Encoding BACnet Tags
|
||||
// returns the number of apdu bytes consumed
|
||||
/* from clause 20.2.9 Encoding of a Character String Value */
|
||||
/* and 20.2.1 General Rules for Encoding BACnet Tags */
|
||||
/* returns the number of apdu bytes consumed */
|
||||
int encode_bacnet_character_string(uint8_t * apdu,
|
||||
BACNET_CHARACTER_STRING * char_string);
|
||||
int encode_tagged_character_string(uint8_t * apdu,
|
||||
@@ -124,9 +124,9 @@ extern "C" {
|
||||
int decode_character_string(uint8_t * apdu, uint32_t len_value,
|
||||
BACNET_CHARACTER_STRING * char_string);
|
||||
|
||||
// from clause 20.2.4 Encoding of an Unsigned Integer Value
|
||||
// and 20.2.1 General Rules for Encoding BACnet Tags
|
||||
// returns the number of apdu bytes consumed
|
||||
/* from clause 20.2.4 Encoding of an Unsigned Integer Value */
|
||||
/* and 20.2.1 General Rules for Encoding BACnet Tags */
|
||||
/* returns the number of apdu bytes consumed */
|
||||
int encode_bacnet_unsigned(uint8_t * apdu, uint32_t value);
|
||||
int encode_context_unsigned(uint8_t * apdu, int tag_number,
|
||||
uint32_t value);
|
||||
@@ -134,27 +134,27 @@ extern "C" {
|
||||
int decode_unsigned(uint8_t * apdu, uint32_t len_value,
|
||||
uint32_t * value);
|
||||
|
||||
// from clause 20.2.5 Encoding of a Signed Integer Value
|
||||
// and 20.2.1 General Rules for Encoding BACnet Tags
|
||||
// returns the number of apdu bytes consumed
|
||||
/* from clause 20.2.5 Encoding of a Signed Integer Value */
|
||||
/* and 20.2.1 General Rules for Encoding BACnet Tags */
|
||||
/* returns the number of apdu bytes consumed */
|
||||
int encode_bacnet_signed(uint8_t * apdu, int32_t value);
|
||||
int encode_tagged_signed(uint8_t * apdu, int32_t value);
|
||||
int encode_context_signed(uint8_t * apdu, int tag_number,
|
||||
int32_t value);
|
||||
int decode_signed(uint8_t * apdu, uint32_t len_value, int32_t * value);
|
||||
|
||||
// from clause 20.2.11 Encoding of an Enumerated Value
|
||||
// and 20.2.1 General Rules for Encoding BACnet Tags
|
||||
// returns the number of apdu bytes consumed
|
||||
/* from clause 20.2.11 Encoding of an Enumerated Value */
|
||||
/* and 20.2.1 General Rules for Encoding BACnet Tags */
|
||||
/* returns the number of apdu bytes consumed */
|
||||
int decode_enumerated(uint8_t * apdu, uint32_t len_value, int *value);
|
||||
int encode_bacnet_enumerated(uint8_t * apdu, int value);
|
||||
int encode_tagged_enumerated(uint8_t * apdu, int value);
|
||||
int encode_context_enumerated(uint8_t * apdu, int tag_number,
|
||||
int value);
|
||||
|
||||
// from clause 20.2.13 Encoding of a Time Value
|
||||
// and 20.2.1 General Rules for Encoding BACnet Tags
|
||||
// returns the number of apdu bytes consumed
|
||||
/* from clause 20.2.13 Encoding of a Time Value */
|
||||
/* and 20.2.1 General Rules for Encoding BACnet Tags */
|
||||
/* returns the number of apdu bytes consumed */
|
||||
int encode_bacnet_time(uint8_t * apdu, int hour, int min, int sec,
|
||||
int hundredths);
|
||||
int encode_tagged_time(uint8_t * apdu, int hour, int min, int sec,
|
||||
@@ -162,15 +162,15 @@ extern "C" {
|
||||
int decode_bacnet_time(uint8_t * apdu, int *hour, int *min, int *sec,
|
||||
int *hundredths);
|
||||
|
||||
// BACnet Date
|
||||
// year = years since 1900
|
||||
// month 1=Jan
|
||||
// day = day of month
|
||||
// wday 1=Monday...7=Sunday
|
||||
/* BACnet Date */
|
||||
/* year = years since 1900 */
|
||||
/* month 1=Jan */
|
||||
/* day = day of month */
|
||||
/* wday 1=Monday...7=Sunday */
|
||||
|
||||
// from clause 20.2.12 Encoding of a Date Value
|
||||
// and 20.2.1 General Rules for Encoding BACnet Tags
|
||||
// returns the number of apdu bytes consumed
|
||||
/* from clause 20.2.12 Encoding of a Date Value */
|
||||
/* and 20.2.1 General Rules for Encoding BACnet Tags */
|
||||
/* returns the number of apdu bytes consumed */
|
||||
int encode_bacnet_date(uint8_t * apdu, int year, int month, int day,
|
||||
int wday);
|
||||
int encode_tagged_date(uint8_t * apdu, int year, int month, int day,
|
||||
@@ -178,21 +178,21 @@ extern "C" {
|
||||
int decode_date(uint8_t * apdu, int *year, int *month, int *day,
|
||||
int *wday);
|
||||
|
||||
// two octet unsigned16
|
||||
/* two octet unsigned16 */
|
||||
int encode_unsigned16(uint8_t * apdu, uint16_t value);
|
||||
int decode_unsigned16(uint8_t * apdu, uint16_t * value);
|
||||
// four octet unsigned32
|
||||
/* four octet unsigned32 */
|
||||
int encode_unsigned32(uint8_t * apdu, uint32_t value);
|
||||
int decode_unsigned32(uint8_t * apdu, uint32_t * value);
|
||||
|
||||
// from clause 20.1.2.4 max-segments-accepted
|
||||
// and clause 20.1.2.5 max-APDU-length-accepted
|
||||
// returns the encoded octet
|
||||
/* from clause 20.1.2.4 max-segments-accepted */
|
||||
/* and clause 20.1.2.5 max-APDU-length-accepted */
|
||||
/* returns the encoded octet */
|
||||
uint8_t encode_max_segs_max_apdu(int max_segs, int max_apdu);
|
||||
int decode_max_segs(uint8_t octet);
|
||||
int decode_max_apdu(uint8_t octet);
|
||||
|
||||
// returns the number of apdu bytes consumed
|
||||
/* returns the number of apdu bytes consumed */
|
||||
int encode_simple_ack(uint8_t * apdu, uint8_t invoke_id,
|
||||
uint8_t service_choice);
|
||||
|
||||
|
||||
+16
-16
@@ -39,23 +39,23 @@
|
||||
#include "bacenum.h"
|
||||
#include "config.h"
|
||||
|
||||
// largest BACnet Instance Number
|
||||
// Also used as a device instance number wildcard address
|
||||
/* largest BACnet Instance Number */
|
||||
/* Also used as a device instance number wildcard address */
|
||||
#define BACNET_MAX_INSTANCE (0x3FFFFF)
|
||||
#define BACNET_INSTANCE_BITS 22
|
||||
// large BACnet Object Type
|
||||
/* large BACnet Object Type */
|
||||
#define BACNET_MAX_OBJECT (0x3FF)
|
||||
// Array index 0=size of array, n=array element n, MAX=all array elements
|
||||
/* Array index 0=size of array, n=array element n, MAX=all array elements */
|
||||
#define BACNET_ARRAY_LENGTH_INDEX 0
|
||||
#define BACNET_ARRAY_ALL (~0)
|
||||
// Priority Array for commandable objects
|
||||
/* Priority Array for commandable objects */
|
||||
#define BACNET_NO_PRIORITY 0
|
||||
#define BACNET_MIN_PRIORITY 1
|
||||
#define BACNET_MAX_PRIORITY 16
|
||||
|
||||
// embedded systems need fixed name sizes
|
||||
/* embedded systems need fixed name sizes */
|
||||
#define MAX_OBJECT_NAME 10
|
||||
// common object properties
|
||||
/* common object properties */
|
||||
typedef struct BACnet_Object_Data {
|
||||
uint32_t Object_Identifier;
|
||||
char Object_Name[MAX_OBJECT_NAME];
|
||||
@@ -63,20 +63,20 @@ typedef struct BACnet_Object_Data {
|
||||
} BACNET_OBJECT_DATA;
|
||||
|
||||
#define BACNET_BROADCAST_NETWORK 0xFFFF
|
||||
// IPv6 (16 octets) coupled with port number (2 octets)
|
||||
/* IPv6 (16 octets) coupled with port number (2 octets) */
|
||||
#define MAX_MAC_LEN 18
|
||||
struct BACnet_Device_Address {
|
||||
// mac_len = 0 if global address
|
||||
/* mac_len = 0 if global address */
|
||||
int mac_len;
|
||||
// note: MAC for IP addresses uses 4 bytes for addr, 2 bytes for port
|
||||
// use de/encode_unsigned32/16 for re/storing the IP address
|
||||
/* note: MAC for IP addresses uses 4 bytes for addr, 2 bytes for port */
|
||||
/* use de/encode_unsigned32/16 for re/storing the IP address */
|
||||
uint8_t mac[MAX_MAC_LEN];
|
||||
// DNET,DLEN,DADR or SNET,SLEN,SADR
|
||||
// the following are used if the device is behind a router
|
||||
// net = 0 indicates local
|
||||
/* DNET,DLEN,DADR or SNET,SLEN,SADR */
|
||||
/* the following are used if the device is behind a router */
|
||||
/* net = 0 indicates local */
|
||||
uint16_t net; /* BACnet network number */
|
||||
// LEN = 0 denotes broadcast MAC ADR and ADR field is absent
|
||||
// LEN > 0 specifies length of ADR field
|
||||
/* LEN = 0 denotes broadcast MAC ADR and ADR field is absent */
|
||||
/* LEN > 0 specifies length of ADR field */
|
||||
int len; /* length of MAC address */
|
||||
uint8_t adr[MAX_MAC_LEN]; /* hwaddr (MAC) address */
|
||||
};
|
||||
|
||||
+89
-89
@@ -130,7 +130,7 @@ typedef enum {
|
||||
PROP_PROGRAM_STATE = 92,
|
||||
PROP_PROPORTIONAL_CONSTANT = 93,
|
||||
PROP_PROPORTIONAL_CONSTANT_UNITS = 94,
|
||||
PROP_PROTOCOL_CONFORMANCE_CLASS = 95, // deleted in version 1 revision 2
|
||||
PROP_PROTOCOL_CONFORMANCE_CLASS = 95, /* deleted in version 1 revision 2 */
|
||||
PROP_PROTOCOL_OBJECT_TYPES_SUPPORTED = 96,
|
||||
PROP_PROTOCOL_SERVICES_SUPPORTED = 97,
|
||||
PROP_PROTOCOL_VERSION = 98,
|
||||
@@ -229,13 +229,13 @@ typedef enum {
|
||||
PROP_VALUE_SET = 191,
|
||||
PROP_VALUE_CHANGE_TIME = 192,
|
||||
|
||||
// The special property identifiers all, optional, and required
|
||||
// are reserved for use in the ReadPropertyConditional and
|
||||
// ReadPropertyMultiple services or services not defined in this standard.
|
||||
// Enumerated values 0-511 are reserved for definition by ASHRAE.
|
||||
// Enumerated values 512-4194303 may be used by others subject to the
|
||||
// procedures and constraints described in Clause 23.
|
||||
// The highest enumeration used in this version is 168.
|
||||
/* The special property identifiers all, optional, and required */
|
||||
/* are reserved for use in the ReadPropertyConditional and */
|
||||
/* ReadPropertyMultiple services or services not defined in this standard. */
|
||||
/* Enumerated values 0-511 are reserved for definition by ASHRAE. */
|
||||
/* Enumerated values 512-4194303 may be used by others subject to the */
|
||||
/* procedures and constraints described in Clause 23. */
|
||||
/* The highest enumeration used in this version is 168. */
|
||||
MAX_BACNET_PROPERTY_ID = 4194303
|
||||
} BACNET_PROPERTY_ID;
|
||||
|
||||
@@ -520,9 +520,9 @@ typedef enum {
|
||||
PROGRAM_ERROR_INTERNAL = 2,
|
||||
PROGRAM_ERROR_PROGRAM = 3,
|
||||
PROGRAM_ERROR_OTHER = 4
|
||||
// Enumerated values 0-63 are reserved for definition by ASHRAE.
|
||||
// Enumerated values 64-65535 may be used by others subject to
|
||||
// the procedures and constraints described in Clause 23.
|
||||
/* Enumerated values 0-63 are reserved for definition by ASHRAE. */
|
||||
/* Enumerated values 64-65535 may be used by others subject to */
|
||||
/* the procedures and constraints described in Clause 23. */
|
||||
} BACNET_PROGRAM_ERROR;
|
||||
|
||||
typedef enum {
|
||||
@@ -537,9 +537,9 @@ typedef enum {
|
||||
RELIABILITY_PROCESS_ERROR = 8,
|
||||
RELIABILITY_MULTI_STATE_FAULT = 9,
|
||||
RELIABILITY_CONFIGURATION_ERROR = 10
|
||||
// Enumerated values 0-63 are reserved for definition by ASHRAE.
|
||||
// Enumerated values 64-65535 may be used by others subject to
|
||||
// the procedures and constraints described in Clause 23.
|
||||
/* Enumerated values 0-63 are reserved for definition by ASHRAE. */
|
||||
/* Enumerated values 64-65535 may be used by others subject to */
|
||||
/* the procedures and constraints described in Clause 23. */
|
||||
} BACNET_RELIABILITY;
|
||||
|
||||
typedef enum {
|
||||
@@ -555,13 +555,13 @@ typedef enum {
|
||||
EVENT_EXTENDED = 9,
|
||||
EVENT_BUFFER_READY = 10,
|
||||
EVENT_UNSIGNED_RANGE = 11,
|
||||
// Enumerated values 0-63 are reserved for definition by ASHRAE.
|
||||
// Enumerated values 64-65535 may be used by others subject to
|
||||
// the procedures and constraints described in Clause 23.
|
||||
// It is expected that these enumerated values will correspond to
|
||||
// the use of the complex-event-type CHOICE [6] of the
|
||||
// BACnetNotificationParameters production.
|
||||
// The last enumeration used in this version is 11.
|
||||
/* Enumerated values 0-63 are reserved for definition by ASHRAE. */
|
||||
/* Enumerated values 64-65535 may be used by others subject to */
|
||||
/* the procedures and constraints described in Clause 23. */
|
||||
/* It is expected that these enumerated values will correspond to */
|
||||
/* the use of the complex-event-type CHOICE [6] of the */
|
||||
/* BACnetNotificationParameters production. */
|
||||
/* The last enumeration used in this version is 11. */
|
||||
} BACNET_EVENT_TYPE;
|
||||
|
||||
typedef enum {
|
||||
@@ -586,9 +586,9 @@ typedef enum {
|
||||
LIFE_SAFETY_MODE_DISABLED = 12,
|
||||
LIFE_SAFETY_MODE_AUTOMATIC_RELEASE_DISABLED = 13,
|
||||
LIFE_SAFETY_MODE_DEFAULT = 14
|
||||
// Enumerated values 0-255 are reserved for definition by ASHRAE.
|
||||
// Enumerated values 256-65535 may be used by others subject to
|
||||
// procedures and constraints described in Clause 23.
|
||||
/* Enumerated values 0-255 are reserved for definition by ASHRAE. */
|
||||
/* Enumerated values 256-65535 may be used by others subject to */
|
||||
/* procedures and constraints described in Clause 23. */
|
||||
} BACNET_LIFE_SAFETY_MODE;
|
||||
|
||||
typedef enum {
|
||||
@@ -602,9 +602,9 @@ typedef enum {
|
||||
LIFE_SAFETY_OPERATION_UNSILENCE = 7,
|
||||
LIFE_SAFETY_OPERATION_UNSILENCE_AUDIBLE = 8,
|
||||
LIFE_SAFETY_OPERATION_UNSILENCE_VISUAL = 9
|
||||
// Enumerated values 0-63 are reserved for definition by ASHRAE.
|
||||
// Enumerated values 64-65535 may be used by others subject to
|
||||
// procedures and constraints described in Clause 23.
|
||||
/* Enumerated values 0-63 are reserved for definition by ASHRAE. */
|
||||
/* Enumerated values 64-65535 may be used by others subject to */
|
||||
/* procedures and constraints described in Clause 23. */
|
||||
} BACNET_LIFE_SAFETY_OPERATION;
|
||||
|
||||
typedef enum {
|
||||
@@ -632,9 +632,9 @@ typedef enum {
|
||||
LIFE_SAFETY_STATE_GENERAL_ALARM = 21,
|
||||
LIFE_SAFETY_STATE_SUPERVISORY = 22,
|
||||
LIFE_SAFETY_STATE_TEST_SUPERVISORY = 23
|
||||
// Enumerated values 0-255 are reserved for definition by ASHRAE.
|
||||
// Enumerated values 256-65535 may be used by others subject to
|
||||
// procedures and constraints described in Clause 23.
|
||||
/* Enumerated values 0-255 are reserved for definition by ASHRAE. */
|
||||
/* Enumerated values 256-65535 may be used by others subject to */
|
||||
/* procedures and constraints described in Clause 23. */
|
||||
} BACNET_LIFE_SAFETY_STATE;
|
||||
|
||||
typedef enum {
|
||||
@@ -642,9 +642,9 @@ typedef enum {
|
||||
MAINTENANCE_PERIODIC_TEST = 1,
|
||||
AINTENANCE_NEED_SERVICE_OPERATIONAL = 2,
|
||||
MAINTENANCE_NEED_SERVICE_INOPERATIVE = 3
|
||||
// Enumerated values 0-255 are reserved for definition by ASHRAE.
|
||||
// Enumerated values 256-65535 may be used by others subject to
|
||||
// procedures and constraints described in Clause 23.
|
||||
/* Enumerated values 0-255 are reserved for definition by ASHRAE. */
|
||||
/* Enumerated values 256-65535 may be used by others subject to */
|
||||
/* procedures and constraints described in Clause 23. */
|
||||
} BACNET_MAINTENANCE;
|
||||
|
||||
typedef enum {
|
||||
@@ -679,10 +679,10 @@ typedef enum {
|
||||
OBJECT_LIFE_SAFETY_ZONE = 22,
|
||||
OBJECT_ACCUMULATOR = 23,
|
||||
OBJECT_PULSE_CONVERTER = 24,
|
||||
// Enumerated values 0-127 are reserved for definition by ASHRAE.
|
||||
// Enumerated values 128-1023 may be used by others subject to
|
||||
// the procedures and constraints described in Clause 23.
|
||||
MAX_ASHRAE_OBJECT_TYPE = 25, // used for bit string loop
|
||||
/* Enumerated values 0-127 are reserved for definition by ASHRAE. */
|
||||
/* Enumerated values 128-1023 may be used by others subject to */
|
||||
/* the procedures and constraints described in Clause 23. */
|
||||
MAX_ASHRAE_OBJECT_TYPE = 25, /* used for bit string loop */
|
||||
MAX_BACNET_OBJECT_TYPE = 1023
|
||||
} BACNET_OBJECT_TYPE;
|
||||
|
||||
@@ -702,9 +702,9 @@ typedef enum {
|
||||
VT_CLASS_DEC_VT220 = 4,
|
||||
VT_CLASS_HP_700_94 = 5, /* real name is HP 700/94 */
|
||||
VT_CLASS_IBM_3130 = 6
|
||||
// Enumerated values 0-63 are reserved for definition by ASHRAE.
|
||||
// Enumerated values 64-65535 may be used by others subject to
|
||||
// the procedures and constraints described in Clause 23.
|
||||
/* Enumerated values 0-63 are reserved for definition by ASHRAE. */
|
||||
/* Enumerated values 64-65535 may be used by others subject to */
|
||||
/* the procedures and constraints described in Clause 23. */
|
||||
} BACNET_VT_CLASS;
|
||||
|
||||
typedef enum {
|
||||
@@ -736,8 +736,8 @@ typedef enum {
|
||||
MAX_BACNET_APPLICATION_TAG = 16
|
||||
} BACNET_APPLICATION_TAG;
|
||||
|
||||
// note: these are not the real values,
|
||||
// but are shifted left for easy encoding
|
||||
/* note: these are not the real values, */
|
||||
/* but are shifted left for easy encoding */
|
||||
typedef enum {
|
||||
PDU_TYPE_CONFIRMED_SERVICE_REQUEST = 0,
|
||||
PDU_TYPE_UNCONFIRMED_SERVICE_REQUEST = 0x10,
|
||||
@@ -750,7 +750,7 @@ typedef enum {
|
||||
} BACNET_PDU_TYPE;
|
||||
|
||||
typedef enum {
|
||||
// Alarm and Event Services
|
||||
/* Alarm and Event Services */
|
||||
SERVICE_CONFIRMED_ACKNOWLEDGE_ALARM = 0,
|
||||
SERVICE_CONFIRMED_COV_NOTIFICATION = 1,
|
||||
SERVICE_CONFIRMED_EVENT_NOTIFICATION = 2,
|
||||
@@ -760,10 +760,10 @@ typedef enum {
|
||||
SERVICE_CONFIRMED_SUBSCRIBE_COV = 5,
|
||||
SERVICE_CONFIRMED_SUBSCRIBE_COV_PROPERTY = 28,
|
||||
SERVICE_CONFIRMED_LIFE_SAFETY_OPERATION = 27,
|
||||
// File Access Services
|
||||
/* File Access Services */
|
||||
SERVICE_CONFIRMED_ATOMIC_READ_FILE = 6,
|
||||
SERVICE_CONFIRMED_ATOMIC_WRITE_FILE = 7,
|
||||
// Object Access Services
|
||||
/* Object Access Services */
|
||||
SERVICE_CONFIRMED_ADD_LIST_ELEMENT = 8,
|
||||
SERVICE_CONFIRMED_REMOVE_LIST_ELEMENT = 9,
|
||||
SERVICE_CONFIRMED_CREATE_OBJECT = 10,
|
||||
@@ -774,23 +774,23 @@ typedef enum {
|
||||
SERVICE_CONFIRMED_READ_RANGE = 26,
|
||||
SERVICE_CONFIRMED_WRITE_PROPERTY = 15,
|
||||
SERVICE_CONFIRMED_WRITE_PROPERTY_MULTIPLE = 16,
|
||||
// Remote Device Management Services
|
||||
/* Remote Device Management Services */
|
||||
SERVICE_CONFIRMED_DEVICE_COMMUNICATION_CONTROL = 17,
|
||||
SERVICE_CONFIRMED_PRIVATE_TRANSFER = 18,
|
||||
SERVICE_CONFIRMED_TEXT_MESSAGE = 19,
|
||||
SERVICE_CONFIRMED_REINITIALIZE_DEVICE = 20,
|
||||
// Virtual Terminal Services
|
||||
/* Virtual Terminal Services */
|
||||
SERVICE_CONFIRMED_VT_OPEN = 21,
|
||||
SERVICE_CONFIRMED_VT_CLOSE = 22,
|
||||
SERVICE_CONFIRMED_VT_DATA = 23,
|
||||
// Security Services
|
||||
/* Security Services */
|
||||
SERVICE_CONFIRMED_AUTHENTICATE = 24,
|
||||
SERVICE_CONFIRMED_REQUEST_KEY = 25,
|
||||
// Services added after 1995
|
||||
// readRange (26) see Object Access Services
|
||||
// lifeSafetyOperation (27) see Alarm and Event Services
|
||||
// subscribeCOVProperty (28) see Alarm and Event Services
|
||||
// getEventInformation (29) see Alarm and Event Services
|
||||
/* Services added after 1995 */
|
||||
/* readRange (26) see Object Access Services */
|
||||
/* lifeSafetyOperation (27) see Alarm and Event Services */
|
||||
/* subscribeCOVProperty (28) see Alarm and Event Services */
|
||||
/* getEventInformation (29) see Alarm and Event Services */
|
||||
MAX_BACNET_CONFIRMED_SERVICE = 30
|
||||
} BACNET_CONFIRMED_SERVICE;
|
||||
|
||||
@@ -805,17 +805,17 @@ typedef enum {
|
||||
SERVICE_UNCONFIRMED_WHO_HAS = 7,
|
||||
SERVICE_UNCONFIRMED_WHO_IS = 8,
|
||||
SERVICE_UNCONFIRMED_UTC_TIME_SYNCHRONIZATION = 9,
|
||||
// Other services to be added as they are defined.
|
||||
// All choice values in this production are reserved
|
||||
// for definition by ASHRAE.
|
||||
// Proprietary extensions are made by using the
|
||||
// UnconfirmedPrivateTransfer service. See Clause 23.
|
||||
/* Other services to be added as they are defined. */
|
||||
/* All choice values in this production are reserved */
|
||||
/* for definition by ASHRAE. */
|
||||
/* Proprietary extensions are made by using the */
|
||||
/* UnconfirmedPrivateTransfer service. See Clause 23. */
|
||||
MAX_BACNET_UNCONFIRMED_SERVICE = 10
|
||||
} BACNET_UNCONFIRMED_SERVICE;
|
||||
|
||||
// Bit String Enumerations
|
||||
/* Bit String Enumerations */
|
||||
typedef enum {
|
||||
// Alarm and Event Services
|
||||
/* Alarm and Event Services */
|
||||
SERVICE_SUPPORTED_ACKNOWLEDGE_ALARM = 0,
|
||||
SERVICE_SUPPORTED_CONFIRMED_COV_NOTIFICATION = 1,
|
||||
SERVICE_SUPPORTED_CONFIRMED_EVENT_NOTIFICATION = 2,
|
||||
@@ -825,10 +825,10 @@ typedef enum {
|
||||
SERVICE_SUPPORTED_SUBSCRIBE_COV = 5,
|
||||
SERVICE_SUPPORTED_SUBSCRIBE_COV_PROPERTY = 38,
|
||||
SERVICE_SUPPORTED_LIFE_SAFETY_OPERATION = 37,
|
||||
// File Access Services
|
||||
/* File Access Services */
|
||||
SERVICE_SUPPORTED_ATOMIC_READ_FILE = 6,
|
||||
SERVICE_SUPPORTED_ATOMIC_WRITE_FILE = 7,
|
||||
// Object Access Services
|
||||
/* Object Access Services */
|
||||
SERVICE_SUPPORTED_ADD_LIST_ELEMENT = 8,
|
||||
SERVICE_SUPPORTED_REMOVE_LIST_ELEMENT = 9,
|
||||
SERVICE_SUPPORTED_CREATE_OBJECT = 10,
|
||||
@@ -839,16 +839,16 @@ typedef enum {
|
||||
SERVICE_SUPPORTED_READ_RANGE = 35,
|
||||
SERVICE_SUPPORTED_WRITE_PROPERTY = 15,
|
||||
SERVICE_SUPPORTED_WRITE_PROPERTY_MULTIPLE = 16,
|
||||
// Remote Device Management Services
|
||||
/* Remote Device Management Services */
|
||||
SERVICE_SUPPORTED_DEVICE_COMMUNICATION_CONTROL = 17,
|
||||
SERVICE_SUPPORTED_PRIVATE_TRANSFER = 18,
|
||||
SERVICE_SUPPORTED_TEXT_MESSAGE = 19,
|
||||
SERVICE_SUPPORTED_REINITIALIZE_DEVICE = 20,
|
||||
// Virtual Terminal Services
|
||||
/* Virtual Terminal Services */
|
||||
SERVICE_SUPPORTED_VT_OPEN = 21,
|
||||
SERVICE_SUPPORTED_VT_CLOSE = 22,
|
||||
SERVICE_SUPPORTED_VT_DATA = 23,
|
||||
// Security Services
|
||||
/* Security Services */
|
||||
SERVICE_SUPPORTED_AUTHENTICATE = 24,
|
||||
SERVICE_SUPPORTED_REQUEST_KEY = 25,
|
||||
SERVICE_SUPPORTED_I_AM = 26,
|
||||
@@ -861,13 +861,13 @@ typedef enum {
|
||||
SERVICE_SUPPORTED_UTC_TIME_SYNCHRONIZATION = 36,
|
||||
SERVICE_SUPPORTED_WHO_HAS = 33,
|
||||
SERVICE_SUPPORTED_WHO_IS = 34,
|
||||
// Other services to be added as they are defined.
|
||||
// All values in this production are reserved
|
||||
// for definition by ASHRAE.
|
||||
/* Other services to be added as they are defined. */
|
||||
/* All values in this production are reserved */
|
||||
/* for definition by ASHRAE. */
|
||||
MAX_BACNET_SERVICES_SUPPORTED = 40
|
||||
} BACNET_SERVICES_SUPPORTED;
|
||||
|
||||
// Bit String Enumerations
|
||||
/* Bit String Enumerations */
|
||||
typedef enum {
|
||||
STATUS_FLAG_IN_ALARM = 0,
|
||||
STATUS_FLAG_FAULT = 1,
|
||||
@@ -918,10 +918,10 @@ typedef enum {
|
||||
MESSAGE_PRIORITY_LIFE_SAFETY = 3
|
||||
} BACNET_MESSAGE_PRIORITY;
|
||||
|
||||
//Network Layer Message Type
|
||||
//If Bit 7 of the control octet described in 6.2.2 is 1,
|
||||
// a message type octet shall be present as shown in Figure 6-1.
|
||||
// The following message types are indicated:
|
||||
/*Network Layer Message Type */
|
||||
/*If Bit 7 of the control octet described in 6.2.2 is 1, */
|
||||
/* a message type octet shall be present as shown in Figure 6-1. */
|
||||
/* The following message types are indicated: */
|
||||
typedef enum {
|
||||
NETWORK_MESSAGE_WHO_IS_ROUTER_TO_NETWORK = 0,
|
||||
NETWORK_MESSAGE_I_AM_ROUTER_TO_NETWORK = 1,
|
||||
@@ -933,8 +933,8 @@ typedef enum {
|
||||
NETWORK_MESSAGE_INITIALIZE_ROUTING_TABLE_ACK = 7,
|
||||
NETWORK_MESSAGE_ESTABLISH_CONNECTION_TO_NETWORK = 8,
|
||||
NETWORK_MESSAGE_DISCONNECT_CONNECTION_TO_NETWORK = 9
|
||||
// X'0A' to X'7F': Reserved for use by ASHRAE,
|
||||
// X'80' to X'FF': Available for vendor proprietary messages
|
||||
/* X'0A' to X'7F': Reserved for use by ASHRAE, */
|
||||
/* X'80' to X'FF': Available for vendor proprietary messages */
|
||||
} BACNET_NETWORK_MESSAGE_TYPE;
|
||||
|
||||
|
||||
@@ -954,9 +954,9 @@ typedef enum {
|
||||
ABORT_REASON_INVALID_APDU_IN_THIS_STATE = 2,
|
||||
ABORT_REASON_PREEMPTED_BY_HIGHER_PRIORITY_TASK = 3,
|
||||
ABORT_REASON_SEGMENTATION_NOT_SUPPORTED = 4,
|
||||
// Enumerated values 0-63 are reserved for definition by ASHRAE.
|
||||
// Enumerated values 64-65535 may be used by others subject to
|
||||
// the procedures and constraints described in Clause 23.
|
||||
/* Enumerated values 0-63 are reserved for definition by ASHRAE. */
|
||||
/* Enumerated values 64-65535 may be used by others subject to */
|
||||
/* the procedures and constraints described in Clause 23. */
|
||||
MAX_BACNET_ABORT_REASON = 5,
|
||||
FIRST_PROPRIETARY_ABORT_REASON = 64,
|
||||
LAST_PROPRIETARY_ABORT_REASON = 65535
|
||||
@@ -973,9 +973,9 @@ typedef enum {
|
||||
REJECT_REASON_TOO_MANY_ARGUMENTS = 7,
|
||||
REJECT_REASON_UNDEFINED_ENUMERATION = 8,
|
||||
REJECT_REASON_UNRECOGNIZED_SERVICE = 9,
|
||||
// Enumerated values 0-63 are reserved for definition by ASHRAE.
|
||||
// Enumerated values 64-65535 may be used by others subject to
|
||||
// the procedures and constraints described in Clause 23.
|
||||
/* Enumerated values 0-63 are reserved for definition by ASHRAE. */
|
||||
/* Enumerated values 64-65535 may be used by others subject to */
|
||||
/* the procedures and constraints described in Clause 23. */
|
||||
MAX_BACNET_REJECT_REASON = 10,
|
||||
FIRST_PROPRIETARY_REJECT_REASON = 64,
|
||||
LAST_PROPRIETARY_REJECT_REASON = 65535
|
||||
@@ -989,9 +989,9 @@ typedef enum {
|
||||
ERROR_CLASS_SECURITY = 4,
|
||||
ERROR_CLASS_SERVICES = 5,
|
||||
ERROR_CLASS_VT = 6,
|
||||
// Enumerated values 0-63 are reserved for definition by ASHRAE.
|
||||
// Enumerated values 64-65535 may be used by others subject to
|
||||
// the procedures and constraints described in Clause 23.
|
||||
/* Enumerated values 0-63 are reserved for definition by ASHRAE. */
|
||||
/* Enumerated values 64-65535 may be used by others subject to */
|
||||
/* the procedures and constraints described in Clause 23. */
|
||||
MAX_BACNET_ERROR_CLASS = 7,
|
||||
FIRST_PROPRIETARY_ERROR_CLASS = 64,
|
||||
LAST_PROPRIETARY_ERROR_CLASS = 65535
|
||||
@@ -1057,10 +1057,10 @@ typedef enum {
|
||||
/* see duplicate-name (48), */
|
||||
/* see duplicate-object-id (49), */
|
||||
/* see property-is-not-an-array (50), */
|
||||
// Enumerated values 0-255 are reserved for definition by ASHRAE.
|
||||
// Enumerated values 256-65535 may be used by others subject to
|
||||
// the procedures and constraints described in Clause 23.
|
||||
// The last enumeration used in this version is 50.
|
||||
/* Enumerated values 0-255 are reserved for definition by ASHRAE. */
|
||||
/* Enumerated values 256-65535 may be used by others subject to */
|
||||
/* the procedures and constraints described in Clause 23. */
|
||||
/* The last enumeration used in this version is 50. */
|
||||
MAX_BACNET_ERROR_CODE = 51,
|
||||
FIRST_PROPRIETARY_ERROR_CODE = 256,
|
||||
LAST_PROPRIETARY_ERROR_CODE = 65535
|
||||
@@ -1077,4 +1077,4 @@ typedef enum {
|
||||
MAX_BACNET_REINITIALIZED_STATE = 7
|
||||
} BACNET_REINITIALIZED_STATE;
|
||||
|
||||
#endif // end of BACENUM_H
|
||||
#endif /* end of BACENUM_H */
|
||||
|
||||
+15
-15
@@ -36,20 +36,20 @@
|
||||
#include "bacdcode.h"
|
||||
#include "bacdef.h"
|
||||
|
||||
// encode service
|
||||
/* encode service */
|
||||
int bacerror_encode_apdu(uint8_t * apdu,
|
||||
uint8_t invoke_id,
|
||||
BACNET_CONFIRMED_SERVICE service,
|
||||
BACNET_ERROR_CLASS error_class, BACNET_ERROR_CODE error_code)
|
||||
{
|
||||
int apdu_len = 0; // total length of the apdu, return value
|
||||
int apdu_len = 0; /* total length of the apdu, return value */
|
||||
|
||||
if (apdu) {
|
||||
apdu[0] = PDU_TYPE_ERROR;
|
||||
apdu[1] = invoke_id;
|
||||
apdu[2] = service;
|
||||
apdu_len = 3;
|
||||
// service parameters
|
||||
/* service parameters */
|
||||
apdu_len += encode_tagged_enumerated(&apdu[apdu_len], error_class);
|
||||
apdu_len += encode_tagged_enumerated(&apdu[apdu_len], error_code);
|
||||
}
|
||||
@@ -57,7 +57,7 @@ int bacerror_encode_apdu(uint8_t * apdu,
|
||||
return apdu_len;
|
||||
}
|
||||
|
||||
// decode the application class and code
|
||||
/* decode the application class and code */
|
||||
int bacerror_decode_error_class_and_code(uint8_t * apdu,
|
||||
unsigned apdu_len,
|
||||
BACNET_ERROR_CLASS * error_class, BACNET_ERROR_CODE * error_code)
|
||||
@@ -68,7 +68,7 @@ int bacerror_decode_error_class_and_code(uint8_t * apdu,
|
||||
int decoded_value = 0;
|
||||
|
||||
if (apdu_len) {
|
||||
// error class
|
||||
/* error class */
|
||||
len += decode_tag_number_and_value(&apdu[len],
|
||||
&tag_number, &len_value_type);
|
||||
if (tag_number != BACNET_APPLICATION_TAG_ENUMERATED)
|
||||
@@ -77,7 +77,7 @@ int bacerror_decode_error_class_and_code(uint8_t * apdu,
|
||||
decode_enumerated(&apdu[len], len_value_type, &decoded_value);
|
||||
if (error_class)
|
||||
*error_class = decoded_value;
|
||||
// error code
|
||||
/* error code */
|
||||
len += decode_tag_number_and_value(&apdu[len],
|
||||
&tag_number, &len_value_type);
|
||||
if (tag_number != BACNET_APPLICATION_TAG_ENUMERATED)
|
||||
@@ -91,7 +91,7 @@ int bacerror_decode_error_class_and_code(uint8_t * apdu,
|
||||
return len;
|
||||
}
|
||||
|
||||
// decode the service request only
|
||||
/* decode the service request only */
|
||||
int bacerror_decode_service_request(uint8_t * apdu,
|
||||
unsigned apdu_len,
|
||||
uint8_t * invoke_id,
|
||||
@@ -105,7 +105,7 @@ int bacerror_decode_service_request(uint8_t * apdu,
|
||||
*invoke_id = apdu[0];
|
||||
if (service)
|
||||
*service = apdu[1];
|
||||
// decode the application class and code
|
||||
/* decode the application class and code */
|
||||
len = bacerror_decode_error_class_and_code(&apdu[2],
|
||||
apdu_len - 2, error_class, error_code);
|
||||
}
|
||||
@@ -113,7 +113,7 @@ int bacerror_decode_service_request(uint8_t * apdu,
|
||||
return len;
|
||||
}
|
||||
|
||||
// decode the whole APDU - mainly used for unit testing
|
||||
/* decode the whole APDU - mainly used for unit testing */
|
||||
int bacerror_decode_apdu(uint8_t * apdu,
|
||||
unsigned apdu_len,
|
||||
uint8_t * invoke_id,
|
||||
@@ -124,7 +124,7 @@ int bacerror_decode_apdu(uint8_t * apdu,
|
||||
|
||||
if (!apdu)
|
||||
return -1;
|
||||
// optional checking - most likely was already done prior to this call
|
||||
/* optional checking - most likely was already done prior to this call */
|
||||
if (apdu_len) {
|
||||
if (apdu[0] != PDU_TYPE_ERROR)
|
||||
return -1;
|
||||
@@ -171,7 +171,7 @@ void testBACError(Test * pTest)
|
||||
ct_test(pTest, test_error_class == error_class);
|
||||
ct_test(pTest, test_error_code == error_code);
|
||||
|
||||
// change type to get negative response
|
||||
/* change type to get negative response */
|
||||
apdu[0] = PDU_TYPE_ABORT;
|
||||
len = bacerror_decode_apdu(&apdu[0],
|
||||
apdu_len,
|
||||
@@ -179,14 +179,14 @@ void testBACError(Test * pTest)
|
||||
&test_service, &test_error_class, &test_error_code);
|
||||
ct_test(pTest, len == -1);
|
||||
|
||||
// test NULL APDU
|
||||
/* test NULL APDU */
|
||||
len = bacerror_decode_apdu(NULL,
|
||||
apdu_len,
|
||||
&test_invoke_id,
|
||||
&test_service, &test_error_class, &test_error_code);
|
||||
ct_test(pTest, len == -1);
|
||||
|
||||
// force a zero length
|
||||
/* force a zero length */
|
||||
len = bacerror_decode_apdu(&apdu[0],
|
||||
0,
|
||||
&test_invoke_id,
|
||||
@@ -194,7 +194,7 @@ void testBACError(Test * pTest)
|
||||
ct_test(pTest, len == 0);
|
||||
|
||||
|
||||
// check them all...
|
||||
/* check them all... */
|
||||
for (service = 0; service < MAX_BACNET_CONFIRMED_SERVICE; service++) {
|
||||
for (error_class = 0;
|
||||
error_class < MAX_BACNET_ERROR_CLASS; error_class++) {
|
||||
@@ -217,7 +217,7 @@ void testBACError(Test * pTest)
|
||||
}
|
||||
}
|
||||
|
||||
// max boundaries
|
||||
/* max boundaries */
|
||||
service = 255;
|
||||
error_class = LAST_PROPRIETARY_ERROR_CLASS;
|
||||
error_code = LAST_PROPRIETARY_ERROR_CODE;
|
||||
|
||||
+10
-10
@@ -55,7 +55,7 @@ void bitstring_set_bit(BACNET_BIT_STRING * bit_string, uint8_t bit,
|
||||
uint8_t bit_mask = 1;
|
||||
|
||||
if (byte_number < MAX_BITSTRING_BYTES) {
|
||||
// set max bits used
|
||||
/* set max bits used */
|
||||
if (bit_string->bits_used < (bit + 1))
|
||||
bit_string->bits_used = bit + 1;
|
||||
bit_mask = bit_mask << (bit - (byte_number * 8));
|
||||
@@ -86,17 +86,17 @@ uint8_t bitstring_bits_used(BACNET_BIT_STRING * bit_string)
|
||||
return bit_string->bits_used;
|
||||
}
|
||||
|
||||
// returns the number of bytes that a bit string is using
|
||||
/* returns the number of bytes that a bit string is using */
|
||||
int bitstring_bytes_used(BACNET_BIT_STRING * bit_string)
|
||||
{
|
||||
int len = 0; // return value
|
||||
int len = 0; /* return value */
|
||||
uint8_t used_bytes = 0;
|
||||
uint8_t last_bit = 0;
|
||||
|
||||
if (bit_string->bits_used) {
|
||||
last_bit = bit_string->bits_used - 1;
|
||||
used_bytes = last_bit / 8;
|
||||
// add one for the first byte
|
||||
/* add one for the first byte */
|
||||
used_bytes++;
|
||||
len = used_bytes;
|
||||
}
|
||||
@@ -471,19 +471,19 @@ void testBitString(Test * pTest)
|
||||
BACNET_BIT_STRING bit_string;
|
||||
|
||||
bitstring_init(&bit_string);
|
||||
// verify initialization
|
||||
/* verify initialization */
|
||||
ct_test(pTest, bitstring_bits_used(&bit_string) == 0);
|
||||
for (bit = 0; bit < (MAX_BITSTRING_BYTES * 8); bit++) {
|
||||
ct_test(pTest, bitstring_bit(&bit_string, bit) == false);
|
||||
}
|
||||
|
||||
// test for true
|
||||
/* test for true */
|
||||
for (bit = 0; bit < (MAX_BITSTRING_BYTES * 8); bit++) {
|
||||
bitstring_set_bit(&bit_string, bit, true);
|
||||
ct_test(pTest, bitstring_bits_used(&bit_string) == (bit + 1));
|
||||
ct_test(pTest, bitstring_bit(&bit_string, bit) == true);
|
||||
}
|
||||
// test for false
|
||||
/* test for false */
|
||||
bitstring_init(&bit_string);
|
||||
for (bit = 0; bit < (MAX_BITSTRING_BYTES * 8); bit++) {
|
||||
bitstring_set_bit(&bit_string, bit, false);
|
||||
@@ -504,7 +504,7 @@ void testCharacterString(Test * pTest)
|
||||
size_t test_length = 0;
|
||||
size_t i = 0;
|
||||
|
||||
// verify initialization
|
||||
/* verify initialization */
|
||||
status =
|
||||
characterstring_init(&bacnet_string, CHARACTER_ANSI_X34, NULL, 0);
|
||||
ct_test(pTest, status == true);
|
||||
@@ -562,7 +562,7 @@ void testOctetString(Test * pTest)
|
||||
size_t test_length = 0;
|
||||
size_t i = 0;
|
||||
|
||||
// verify initialization
|
||||
/* verify initialization */
|
||||
status = octetstring_init(&bacnet_string, NULL, 0);
|
||||
ct_test(pTest, status == true);
|
||||
ct_test(pTest, octetstring_length(&bacnet_string) == 0);
|
||||
@@ -625,7 +625,7 @@ int main(void)
|
||||
assert(rc);
|
||||
rc = ct_addTestFunction(pTest, testOctetString);
|
||||
assert(rc);
|
||||
// configure output
|
||||
/* configure output */
|
||||
ct_setStream(pTest, stdout);
|
||||
ct_run(pTest);
|
||||
(void) ct_report(pTest);
|
||||
|
||||
@@ -72,7 +72,7 @@ extern "C" {
|
||||
bool value);
|
||||
bool bitstring_bit(BACNET_BIT_STRING * bit_string, uint8_t bit);
|
||||
uint8_t bitstring_bits_used(BACNET_BIT_STRING * bit_string);
|
||||
// returns the number of bytes that a bit string is using
|
||||
/* returns the number of bytes that a bit string is using */
|
||||
int bitstring_bytes_used(BACNET_BIT_STRING * bit_string);
|
||||
uint8_t bitstring_bits_capacity(BACNET_BIT_STRING * bit_string);
|
||||
/* used for encoding and decoding from the APDU */
|
||||
|
||||
+15
-15
@@ -1,19 +1,19 @@
|
||||
// Big-Endian systems save the most significant byte first.
|
||||
// Sun and Motorola processors, IBM-370s and PDP-10s are big-endian.
|
||||
// "Network Byte Order" is also know as "Big-Endian Byte Order"
|
||||
// for example, a 4 byte integer 67305985 is 0x04030201 in hexidecimal.
|
||||
// x[0] = 0x04
|
||||
// x[1] = 0x03
|
||||
// x[2] = 0x02
|
||||
// x[3] = 0x01
|
||||
/* Big-Endian systems save the most significant byte first. */
|
||||
/* Sun and Motorola processors, IBM-370s and PDP-10s are big-endian. */
|
||||
/* "Network Byte Order" is also know as "Big-Endian Byte Order" */
|
||||
/* for example, a 4 byte integer 67305985 is 0x04030201 in hexidecimal. */
|
||||
/* x[0] = 0x04 */
|
||||
/* x[1] = 0x03 */
|
||||
/* x[2] = 0x02 */
|
||||
/* x[3] = 0x01 */
|
||||
|
||||
// Little-Endian systems save the least significant byte first.
|
||||
// The entire Intel x86 family, Vaxes, Alphas and PDP-11s are little-endian.
|
||||
// for example, a 4 byte integer 67305985 is 0x04030201 in hexidecimal.
|
||||
// x[0] = 0x01
|
||||
// x[1] = 0x02
|
||||
// x[2] = 0x03
|
||||
// x[3] = 0x04
|
||||
/* Little-Endian systems save the least significant byte first. */
|
||||
/* The entire Intel x86 family, Vaxes, Alphas and PDP-11s are little-endian. */
|
||||
/* for example, a 4 byte integer 67305985 is 0x04030201 in hexidecimal. */
|
||||
/* x[0] = 0x01 */
|
||||
/* x[1] = 0x02 */
|
||||
/* x[2] = 0x03 */
|
||||
/* x[3] = 0x04 */
|
||||
|
||||
int big_endian(void)
|
||||
{
|
||||
|
||||
+14
-14
@@ -5,21 +5,21 @@
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
// Big-Endian systems save the most significant byte first.
|
||||
// Sun and Motorola processors, IBM-370s and PDP-10s are big-endian.
|
||||
// for example, a 4 byte integer 67305985 is 0x04030201 in hexidecimal.
|
||||
// x[0] = 0x04
|
||||
// x[1] = 0x03
|
||||
// x[2] = 0x02
|
||||
// x[3] = 0x01
|
||||
/* Big-Endian systems save the most significant byte first. */
|
||||
/* Sun and Motorola processors, IBM-370s and PDP-10s are big-endian. */
|
||||
/* for example, a 4 byte integer 67305985 is 0x04030201 in hexidecimal. */
|
||||
/* x[0] = 0x04 */
|
||||
/* x[1] = 0x03 */
|
||||
/* x[2] = 0x02 */
|
||||
/* x[3] = 0x01 */
|
||||
|
||||
// Little-Endian systems save the least significant byte first.
|
||||
// The entire Intel x86 family, Vaxes, Alphas and PDP-11s are little-endian.
|
||||
// for example, a 4 byte integer 67305985 is 0x04030201 in hexidecimal.
|
||||
// x[0] = 0x01
|
||||
// x[1] = 0x02
|
||||
// x[2] = 0x03
|
||||
// x[3] = 0x04
|
||||
/* Little-Endian systems save the least significant byte first. */
|
||||
/* The entire Intel x86 family, Vaxes, Alphas and PDP-11s are little-endian. */
|
||||
/* for example, a 4 byte integer 67305985 is 0x04030201 in hexidecimal. */
|
||||
/* x[0] = 0x01 */
|
||||
/* x[1] = 0x02 */
|
||||
/* x[2] = 0x03 */
|
||||
/* x[3] = 0x04 */
|
||||
|
||||
int big_endian(void);
|
||||
|
||||
|
||||
+36
-36
@@ -32,11 +32,11 @@
|
||||
-------------------------------------------
|
||||
####COPYRIGHTEND####*/
|
||||
|
||||
#include <stdint.h> // for standard integer types uint8_t etc.
|
||||
#include <stdbool.h> // for the standard bool type.
|
||||
#include <stdint.h> /* for standard integer types uint8_t etc. */
|
||||
#include <stdbool.h> /* for the standard bool type. */
|
||||
#include "bacdcode.h"
|
||||
#include "bip.h"
|
||||
#include "net.h" // custom per port
|
||||
#include "net.h" /* custom per port */
|
||||
|
||||
static int BIP_Socket = -1;
|
||||
/* port to use - stored in host byte order */
|
||||
@@ -95,37 +95,37 @@ void bip_set_broadcast_address(uint8_t octet1,
|
||||
octet4);
|
||||
}
|
||||
|
||||
// set using network byte order
|
||||
/* set using network byte order */
|
||||
void bip_set_addr(uint32_t net_address)
|
||||
{
|
||||
BIP_Address.s_addr = ntohl(net_address);
|
||||
}
|
||||
|
||||
// returns host byte order
|
||||
/* returns host byte order */
|
||||
uint32_t bip_get_addr(void)
|
||||
{
|
||||
return BIP_Address.s_addr;
|
||||
}
|
||||
|
||||
// set using network byte order
|
||||
/* set using network byte order */
|
||||
void bip_set_broadcast_addr(uint32_t net_address)
|
||||
{
|
||||
BIP_Broadcast_Address.s_addr = ntohl(net_address);
|
||||
}
|
||||
|
||||
// returns host byte order
|
||||
/* returns host byte order */
|
||||
uint32_t bip_get_broadcast_addr(void)
|
||||
{
|
||||
return BIP_Broadcast_Address.s_addr;
|
||||
}
|
||||
|
||||
// set using host byte order
|
||||
/* set using host byte order */
|
||||
void bip_set_port(uint16_t port)
|
||||
{
|
||||
BIP_Port = port;
|
||||
}
|
||||
|
||||
// returns host byte order
|
||||
/* returns host byte order */
|
||||
uint16_t bip_get_port(void)
|
||||
{
|
||||
return BIP_Port;
|
||||
@@ -133,14 +133,14 @@ uint16_t bip_get_port(void)
|
||||
|
||||
/* function to send a packet out the BACnet/IP socket (Annex J) */
|
||||
/* returns number of bytes sent on success, negative number on failure */
|
||||
static int bip_send(struct sockaddr_in *bip_dest, uint8_t * pdu, // any data to be sent - may be null
|
||||
unsigned pdu_len) // number of bytes of data
|
||||
{
|
||||
static int bip_send(struct sockaddr_in *bip_dest, uint8_t * pdu, /* any data to be sent - may be null */
|
||||
unsigned pdu_len)
|
||||
{ /* number of bytes of data */
|
||||
uint8_t mtu[MAX_MPDU] = { 0 };
|
||||
int mtu_len = 0;
|
||||
int bytes_sent = 0;
|
||||
|
||||
// assumes that the driver has already been initialized
|
||||
/* assumes that the driver has already been initialized */
|
||||
if (BIP_Socket < 0)
|
||||
return BIP_Socket;
|
||||
|
||||
@@ -165,10 +165,10 @@ static int bip_send(struct sockaddr_in *bip_dest, uint8_t * pdu, // any d
|
||||
|
||||
/* function to send a packet out the BACnet/IP socket (Annex J) */
|
||||
/* returns number of bytes sent on success, negative number on failure */
|
||||
int bip_send_pdu(BACNET_ADDRESS * dest, // destination address
|
||||
uint8_t * pdu, // any data to be sent - may be null
|
||||
unsigned pdu_len) // number of bytes of data
|
||||
{
|
||||
int bip_send_pdu(BACNET_ADDRESS * dest, /* destination address */
|
||||
uint8_t * pdu, /* any data to be sent - may be null */
|
||||
unsigned pdu_len)
|
||||
{ /* number of bytes of data */
|
||||
struct sockaddr_in bip_dest;
|
||||
|
||||
/* load destination IP address */
|
||||
@@ -189,21 +189,21 @@ int bip_send_pdu(BACNET_ADDRESS * dest, // destination address
|
||||
|
||||
/* function to send a packet out the BACnet/IP socket */
|
||||
/* returns 1 on success, 0 on failure */
|
||||
return bip_send(&bip_dest, // destination address
|
||||
pdu, // any data to be sent - may be null
|
||||
pdu_len); // number of bytes of data
|
||||
return bip_send(&bip_dest, /* destination address */
|
||||
pdu, /* any data to be sent - may be null */
|
||||
pdu_len); /* number of bytes of data */
|
||||
}
|
||||
|
||||
// receives a BACnet/IP packet
|
||||
// returns the number of octets in the PDU, or zero on failure
|
||||
uint16_t bip_receive(BACNET_ADDRESS * src, // source address
|
||||
uint8_t * pdu, // PDU data
|
||||
uint16_t max_pdu, // amount of space available in the PDU
|
||||
unsigned timeout) // number of milliseconds to wait for a packet
|
||||
{
|
||||
/* receives a BACnet/IP packet */
|
||||
/* returns the number of octets in the PDU, or zero on failure */
|
||||
uint16_t bip_receive(BACNET_ADDRESS * src, /* source address */
|
||||
uint8_t * pdu, /* PDU data */
|
||||
uint16_t max_pdu, /* amount of space available in the PDU */
|
||||
unsigned timeout)
|
||||
{ /* number of milliseconds to wait for a packet */
|
||||
int received_bytes;
|
||||
uint8_t buf[MAX_MPDU] = { 0 }; // data
|
||||
uint16_t pdu_len = 0; // return value
|
||||
uint8_t buf[MAX_MPDU] = { 0 }; /* data */
|
||||
uint16_t pdu_len = 0; /* return value */
|
||||
fd_set read_fds;
|
||||
int max;
|
||||
struct timeval select_timeout;
|
||||
@@ -259,16 +259,16 @@ uint16_t bip_receive(BACNET_ADDRESS * src, // source address
|
||||
src->mac_len = 6;
|
||||
(void) encode_unsigned32(&src->mac[0], sin.sin_addr.s_addr);
|
||||
(void) encode_unsigned16(&src->mac[4], sin.sin_port);
|
||||
// FIXME: check destination address
|
||||
// see if it is broadcast or for us
|
||||
/* FIXME: check destination address */
|
||||
/* see if it is broadcast or for us */
|
||||
/* decode the length of the PDU - length is inclusive of BVLC */
|
||||
(void) decode_unsigned16(&buf[2], &pdu_len);
|
||||
/* copy the buffer into the PDU */
|
||||
pdu_len -= 4; /* BVLC header */
|
||||
if (pdu_len < max_pdu)
|
||||
memmove(&pdu[0], &buf[4], pdu_len);
|
||||
// ignore packets that are too large
|
||||
// clients should check my max-apdu first
|
||||
/* ignore packets that are too large */
|
||||
/* clients should check my max-apdu first */
|
||||
else
|
||||
pdu_len = 0;
|
||||
}
|
||||
@@ -295,9 +295,9 @@ void bip_get_my_address(BACNET_ADDRESS * my_address)
|
||||
return;
|
||||
}
|
||||
|
||||
void bip_get_broadcast_address(BACNET_ADDRESS * dest) // destination address
|
||||
{
|
||||
int i = 0; // counter
|
||||
void bip_get_broadcast_address(BACNET_ADDRESS * dest)
|
||||
{ /* destination address */
|
||||
int i = 0; /* counter */
|
||||
|
||||
if (dest) {
|
||||
dest->mac_len = 6;
|
||||
|
||||
+19
-19
@@ -40,7 +40,7 @@
|
||||
#include "bacdef.h"
|
||||
#include "net.h"
|
||||
|
||||
// specific defines for Ethernet
|
||||
/* specific defines for Ethernet */
|
||||
#define MAX_HEADER (1 + 1 + 2)
|
||||
#define MAX_MPDU (MAX_HEADER+MAX_PDU)
|
||||
|
||||
@@ -48,47 +48,47 @@
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
// note: define init and cleanup in your ports section
|
||||
/* note: define init and cleanup in your ports section */
|
||||
bool bip_init(void);
|
||||
|
||||
// normal functions...
|
||||
/* normal functions... */
|
||||
void bip_cleanup(void);
|
||||
void bip_set_socket(int sock_fd);
|
||||
bool bip_valid(void);
|
||||
void bip_get_broadcast_address(BACNET_ADDRESS * dest); // destination address
|
||||
void bip_get_broadcast_address(BACNET_ADDRESS * dest); /* destination address */
|
||||
void bip_get_my_address(BACNET_ADDRESS * my_address);
|
||||
|
||||
/* function to send a packet out the BACnet/IP socket */
|
||||
/* returns zero on success, non-zero on failure */
|
||||
int bip_send_pdu(BACNET_ADDRESS * dest, // destination address
|
||||
uint8_t * pdu, // any data to be sent - may be null
|
||||
unsigned pdu_len); // number of bytes of data
|
||||
int bip_send_pdu(BACNET_ADDRESS * dest, /* destination address */
|
||||
uint8_t * pdu, /* any data to be sent - may be null */
|
||||
unsigned pdu_len); /* number of bytes of data */
|
||||
|
||||
// receives a BACnet/IP packet
|
||||
// returns the number of octets in the PDU, or zero on failure
|
||||
uint16_t bip_receive(BACNET_ADDRESS * src, // source address
|
||||
uint8_t * pdu, // PDU data
|
||||
uint16_t max_pdu, // amount of space available in the PDU
|
||||
unsigned timeout); // milliseconds to wait for a packet
|
||||
/* receives a BACnet/IP packet */
|
||||
/* returns the number of octets in the PDU, or zero on failure */
|
||||
uint16_t bip_receive(BACNET_ADDRESS * src, /* source address */
|
||||
uint8_t * pdu, /* PDU data */
|
||||
uint16_t max_pdu, /* amount of space available in the PDU */
|
||||
unsigned timeout); /* milliseconds to wait for a packet */
|
||||
|
||||
void bip_set_address(uint8_t octet1, uint8_t octet2,
|
||||
uint8_t octet3, uint8_t octet4);
|
||||
void bip_set_broadcast_address(uint8_t octet1, uint8_t octet2,
|
||||
uint8_t octet3, uint8_t octet4);
|
||||
|
||||
// use host byte order for setting
|
||||
/* use host byte order for setting */
|
||||
void bip_set_port(uint16_t port);
|
||||
// returns host byte order
|
||||
/* returns host byte order */
|
||||
uint16_t bip_get_port(void);
|
||||
|
||||
// use network byte order for setting
|
||||
/* use network byte order for setting */
|
||||
void bip_set_addr(uint32_t net_address);
|
||||
// returns host byte order
|
||||
/* returns host byte order */
|
||||
uint32_t bip_get_addr(void);
|
||||
|
||||
// use network byte order for setting
|
||||
/* use network byte order for setting */
|
||||
void bip_set_broadcast_addr(uint32_t net_address);
|
||||
// returns host byte order
|
||||
/* returns host byte order */
|
||||
uint32_t bip_get_broadcast_addr(void);
|
||||
|
||||
void bip_set_interface(char *ifname);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Defines the bit/byte/word/long conversions that are used in code
|
||||
/* Defines the bit/byte/word/long conversions that are used in code */
|
||||
|
||||
|
||||
#ifndef BYTES_H
|
||||
@@ -67,4 +67,4 @@
|
||||
|
||||
|
||||
|
||||
#endif // end of header file
|
||||
#endif /* end of header file */
|
||||
|
||||
+21
-21
@@ -1,32 +1,32 @@
|
||||
#ifndef CONFIG_H
|
||||
#define CONFIG_H
|
||||
|
||||
// declare a single physical layer
|
||||
//#include "ethernet.h"
|
||||
//#include "arcnet.h"
|
||||
//#include "mstp.h"
|
||||
/* declare a single physical layer */
|
||||
/*#include "ethernet.h" */
|
||||
/*#include "arcnet.h" */
|
||||
/*#include "mstp.h" */
|
||||
|
||||
// Max number of bytes in an APDU.
|
||||
// Typical sizes are 50, 128, 206, 480, 1024, and 1476 octets
|
||||
// This is used in constructing messages and to tell others our limits
|
||||
// 50 is the minimum; adjust to your memory and physical layer constraints
|
||||
// Lon=206, MS/TP=480, ARCNET=480, Ethernet=1476
|
||||
//#define MAX_APDU 50
|
||||
/* Max number of bytes in an APDU. */
|
||||
/* Typical sizes are 50, 128, 206, 480, 1024, and 1476 octets */
|
||||
/* This is used in constructing messages and to tell others our limits */
|
||||
/* 50 is the minimum; adjust to your memory and physical layer constraints */
|
||||
/* Lon=206, MS/TP=480, ARCNET=480, Ethernet=1476 */
|
||||
/*#define MAX_APDU 50 */
|
||||
#define MAX_APDU 480
|
||||
//#define MAX_APDU 1476
|
||||
/*#define MAX_APDU 1476 */
|
||||
|
||||
// for confirmed messages, this is the number of transactions
|
||||
// that we hold in a queue waiting for timeout.
|
||||
// Configure to zero if you don't want any confirmed messages
|
||||
// Configure from 1..255 for number of outstanding confirmed
|
||||
// requests available.
|
||||
/* for confirmed messages, this is the number of transactions */
|
||||
/* that we hold in a queue waiting for timeout. */
|
||||
/* Configure to zero if you don't want any confirmed messages */
|
||||
/* Configure from 1..255 for number of outstanding confirmed */
|
||||
/* requests available. */
|
||||
#define MAX_TSM_TRANSACTIONS 16
|
||||
|
||||
// The address cache is used for binding to BACnet devices
|
||||
// The number of entries corresponds to the number of
|
||||
// devices that might respond to an I-Am on the network.
|
||||
// If your device is a simple server and does not need to bind,
|
||||
// then you don't need to use this.
|
||||
/* The address cache is used for binding to BACnet devices */
|
||||
/* The number of entries corresponds to the number of */
|
||||
/* devices that might respond to an I-Am on the network. */
|
||||
/* If your device is a simple server and does not need to bind, */
|
||||
/* then you don't need to use this. */
|
||||
#define MAX_ADDRESS_CACHE 255
|
||||
|
||||
#endif
|
||||
|
||||
+19
-19
@@ -36,11 +36,11 @@
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
// Accumulate "dataValue" into the CRC in crcValue.
|
||||
// Return value is updated CRC
|
||||
//
|
||||
// The ^ operator means exclusive OR.
|
||||
// Note: This function is copied directly from the BACnet standard.
|
||||
/* Accumulate "dataValue" into the CRC in crcValue. */
|
||||
/* Return value is updated CRC */
|
||||
/* */
|
||||
/* The ^ operator means exclusive OR. */
|
||||
/* Note: This function is copied directly from the BACnet standard. */
|
||||
uint8_t CRC_Calc_Header(uint8_t dataValue, uint8_t crcValue)
|
||||
{
|
||||
uint16_t crc;
|
||||
@@ -56,11 +56,11 @@ uint8_t CRC_Calc_Header(uint8_t dataValue, uint8_t crcValue)
|
||||
return (crc & 0xfe) ^ ((crc >> 8) & 1);
|
||||
}
|
||||
|
||||
// Accumulate "dataValue" into the CRC in crcValue.
|
||||
// Return value is updated CRC
|
||||
//
|
||||
// The ^ operator means exclusive OR.
|
||||
// Note: This function is copied directly from the BACnet standard.
|
||||
/* Accumulate "dataValue" into the CRC in crcValue. */
|
||||
/* Return value is updated CRC */
|
||||
/* */
|
||||
/* The ^ operator means exclusive OR. */
|
||||
/* Note: This function is copied directly from the BACnet standard. */
|
||||
uint16_t CRC_Calc_Data(uint8_t dataValue, uint16_t crcValue)
|
||||
{
|
||||
uint16_t crcLow;
|
||||
@@ -79,11 +79,11 @@ uint16_t CRC_Calc_Data(uint8_t dataValue, uint16_t crcValue)
|
||||
#include "ctest.h"
|
||||
#include "bytes.h"
|
||||
|
||||
// test from Annex G 1.0 of BACnet Standard
|
||||
/* test from Annex G 1.0 of BACnet Standard */
|
||||
void testCRC8(Test * pTest)
|
||||
{
|
||||
uint8_t crc = 0xff; // accumulates the crc value
|
||||
uint8_t frame_crc; // appended to the end of the frame
|
||||
uint8_t crc = 0xff; /* accumulates the crc value */
|
||||
uint8_t frame_crc; /* appended to the end of the frame */
|
||||
|
||||
crc = CRC_Calc_Header(0x00, crc);
|
||||
ct_test(pTest, crc == 0x55);
|
||||
@@ -95,16 +95,16 @@ void testCRC8(Test * pTest)
|
||||
ct_test(pTest, crc == 0x95);
|
||||
crc = CRC_Calc_Header(0x00, crc);
|
||||
ct_test(pTest, crc == 0x73);
|
||||
// send the ones complement of the CRC in place of
|
||||
// the CRC, and the resulting CRC will always equal 0x55.
|
||||
/* send the ones complement of the CRC in place of */
|
||||
/* the CRC, and the resulting CRC will always equal 0x55. */
|
||||
frame_crc = ~crc;
|
||||
ct_test(pTest, frame_crc == 0x8C);
|
||||
// use the ones complement value and the next to last CRC value
|
||||
/* use the ones complement value and the next to last CRC value */
|
||||
crc = CRC_Calc_Header(frame_crc, crc);
|
||||
ct_test(pTest, crc == 0x55);
|
||||
}
|
||||
|
||||
// test from Annex G 2.0 of BACnet Standard
|
||||
/* test from Annex G 2.0 of BACnet Standard */
|
||||
void testCRC16(Test * pTest)
|
||||
{
|
||||
uint16_t crc = 0xffff;
|
||||
@@ -116,8 +116,8 @@ void testCRC16(Test * pTest)
|
||||
ct_test(pTest, crc == 0xEB70);
|
||||
crc = CRC_Calc_Data(0x30, crc);
|
||||
ct_test(pTest, crc == 0x42EF);
|
||||
// send the ones complement of the CRC in place of
|
||||
// the CRC, and the resulting CRC will always equal 0xF0B8.
|
||||
/* send the ones complement of the CRC in place of */
|
||||
/* the CRC, and the resulting CRC will always equal 0xF0B8. */
|
||||
data_crc = ~crc;
|
||||
ct_test(pTest, data_crc == 0xBD10);
|
||||
crc = CRC_Calc_Data(LO_BYTE(data_crc), crc);
|
||||
|
||||
+16
-16
@@ -35,16 +35,16 @@
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include "datalink.h"
|
||||
// currently this is oriented to a single data link
|
||||
// However, it could handle multiple data links with the
|
||||
// addition of passing a network number or datalink number
|
||||
// as part of the calls.
|
||||
/* currently this is oriented to a single data link */
|
||||
/* However, it could handle multiple data links with the */
|
||||
/* addition of passing a network number or datalink number */
|
||||
/* as part of the calls. */
|
||||
|
||||
/* returns number of bytes sent on success, negative on failure */
|
||||
int datalink_send_pdu(BACNET_ADDRESS * dest, // destination address
|
||||
uint8_t * pdu, // any data to be sent - may be null
|
||||
unsigned pdu_len) // number of bytes of data
|
||||
{
|
||||
int datalink_send_pdu(BACNET_ADDRESS * dest, /* destination address */
|
||||
uint8_t * pdu, /* any data to be sent - may be null */
|
||||
unsigned pdu_len)
|
||||
{ /* number of bytes of data */
|
||||
#ifdef BACDL_ARCNET
|
||||
return arcnet_send_pdu(dest, pdu, pdu_len);
|
||||
#endif
|
||||
@@ -59,12 +59,12 @@ int datalink_send_pdu(BACNET_ADDRESS * dest, // destination address
|
||||
#endif
|
||||
}
|
||||
|
||||
// returns the number of octets in the PDU, or zero on failure
|
||||
uint16_t datalink_receive(BACNET_ADDRESS * src, // source address
|
||||
uint8_t * pdu, // PDU data
|
||||
uint16_t max_pdu, // amount of space available in the PDU
|
||||
unsigned timeout) // number of milliseconds to wait for a packet
|
||||
{
|
||||
/* returns the number of octets in the PDU, or zero on failure */
|
||||
uint16_t datalink_receive(BACNET_ADDRESS * src, /* source address */
|
||||
uint8_t * pdu, /* PDU data */
|
||||
uint16_t max_pdu, /* amount of space available in the PDU */
|
||||
unsigned timeout)
|
||||
{ /* number of milliseconds to wait for a packet */
|
||||
#ifdef BACDL_ARCNET
|
||||
return arcnet_receive(src, pdu, max_pdu, timeout);
|
||||
#endif
|
||||
@@ -95,8 +95,8 @@ void datalink_cleanup(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
void datalink_get_broadcast_address(BACNET_ADDRESS * dest) // destination address
|
||||
{
|
||||
void datalink_get_broadcast_address(BACNET_ADDRESS * dest)
|
||||
{ /* destination address */
|
||||
#ifdef BACDL_ARCNET
|
||||
arcnet_get_broadcast_address(dest);
|
||||
#endif
|
||||
|
||||
@@ -60,19 +60,19 @@ extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
/* returns number of bytes sent on success, negative on failure */
|
||||
int datalink_send_pdu(BACNET_ADDRESS * dest, // destination address
|
||||
uint8_t * pdu, // any data to be sent - may be null
|
||||
unsigned pdu_len); // number of bytes of data
|
||||
int datalink_send_pdu(BACNET_ADDRESS * dest, /* destination address */
|
||||
uint8_t * pdu, /* any data to be sent - may be null */
|
||||
unsigned pdu_len); /* number of bytes of data */
|
||||
|
||||
// returns the number of octets in the PDU, or zero on failure
|
||||
uint16_t datalink_receive(BACNET_ADDRESS * src, // source address
|
||||
uint8_t * pdu, // PDU data
|
||||
uint16_t max_pdu, // amount of space available in the PDU
|
||||
unsigned timeout); // number of milliseconds to wait for a packet
|
||||
/* returns the number of octets in the PDU, or zero on failure */
|
||||
uint16_t datalink_receive(BACNET_ADDRESS * src, /* source address */
|
||||
uint8_t * pdu, /* PDU data */
|
||||
uint16_t max_pdu, /* amount of space available in the PDU */
|
||||
unsigned timeout); /* number of milliseconds to wait for a packet */
|
||||
|
||||
void datalink_cleanup(void);
|
||||
|
||||
void datalink_get_broadcast_address(BACNET_ADDRESS * dest); // destination address
|
||||
void datalink_get_broadcast_address(BACNET_ADDRESS * dest); /* destination address */
|
||||
|
||||
void datalink_get_my_address(BACNET_ADDRESS * my_address);
|
||||
|
||||
|
||||
+2
-2
@@ -213,10 +213,10 @@ int dcc_decode_apdu(uint8_t * apdu,
|
||||
|
||||
if (!apdu)
|
||||
return -1;
|
||||
// optional checking - most likely was already done prior to this call
|
||||
/* optional checking - most likely was already done prior to this call */
|
||||
if (apdu[0] != PDU_TYPE_CONFIRMED_SERVICE_REQUEST)
|
||||
return -1;
|
||||
// apdu[1] = encode_max_segs_max_apdu(0, Device_Max_APDU_Length_Accepted());
|
||||
/* apdu[1] = encode_max_segs_max_apdu(0, Device_Max_APDU_Length_Accepted()); */
|
||||
*invoke_id = apdu[2]; /* invoke id - filled in by net layer */
|
||||
if (apdu[3] != SERVICE_CONFIRMED_REINITIALIZE_DEVICE)
|
||||
return -1;
|
||||
|
||||
+2
-2
@@ -57,11 +57,11 @@ extern "C" {
|
||||
bool dcc_set_status_duration(BACNET_COMMUNICATION_ENABLE_DISABLE
|
||||
status, uint16_t minutes);
|
||||
|
||||
// encode service
|
||||
/* encode service */
|
||||
int dcc_encode_apdu(uint8_t * apdu, uint8_t invoke_id, uint16_t timeDuration, /* 0=optional */
|
||||
BACNET_COMMUNICATION_ENABLE_DISABLE enable_disable, BACNET_CHARACTER_STRING * password); /* NULL=optional */
|
||||
|
||||
// decode the service request only
|
||||
/* decode the service request only */
|
||||
int dcc_decode_service_request(uint8_t * apdu,
|
||||
unsigned apdu_len,
|
||||
uint16_t * timeDuration,
|
||||
|
||||
@@ -58,7 +58,7 @@ extern "C" {
|
||||
BACNET_PROPERTY_ID object_property, int32_t array_index);
|
||||
|
||||
/* returns the invoke ID for confirmed request, or 0 if failed */
|
||||
uint8_t Send_Write_Property_Request(uint32_t device_id, // destination device
|
||||
uint8_t Send_Write_Property_Request(uint32_t device_id, /* destination device */
|
||||
BACNET_OBJECT_TYPE object_type,
|
||||
uint32_t object_instance,
|
||||
BACNET_PROPERTY_ID object_property,
|
||||
|
||||
@@ -59,12 +59,12 @@ void handler_atomic_read_file(uint8_t * service_request,
|
||||
len = arf_decode_service_request(service_request, service_len, &data);
|
||||
if (len < 0)
|
||||
fprintf(stderr, "Unable to decode Atomic-Read-File Request!\n");
|
||||
// prepare a reply
|
||||
/* prepare a reply */
|
||||
datalink_get_my_address(&my_address);
|
||||
// encode the NPDU portion of the packet
|
||||
pdu_len = npdu_encode_apdu(&Handler_Transmit_Buffer[0], src, &my_address, false, // true for confirmed messages
|
||||
/* encode the NPDU portion of the packet */
|
||||
pdu_len = npdu_encode_apdu(&Handler_Transmit_Buffer[0], src, &my_address, false, /* true for confirmed messages */
|
||||
MESSAGE_PRIORITY_NORMAL);
|
||||
// bad decoding - send an abort
|
||||
/* bad decoding - send an abort */
|
||||
if (len < 0) {
|
||||
pdu_len += abort_encode_apdu(&Handler_Transmit_Buffer[pdu_len],
|
||||
service_data->invoke_id, ABORT_REASON_OTHER);
|
||||
@@ -112,8 +112,8 @@ void handler_atomic_read_file(uint8_t * service_request,
|
||||
send = true;
|
||||
}
|
||||
if (send) {
|
||||
bytes_sent = datalink_send_pdu(src, // destination address
|
||||
&Handler_Transmit_Buffer[0], pdu_len); // number of bytes of data
|
||||
bytes_sent = datalink_send_pdu(src, /* destination address */
|
||||
&Handler_Transmit_Buffer[0], pdu_len); /* number of bytes of data */
|
||||
if (bytes_sent <= 0)
|
||||
fprintf(stderr, "Failed to send PDU (%s)!\n", strerror(errno));
|
||||
}
|
||||
|
||||
@@ -41,11 +41,11 @@
|
||||
#include "handlers.h"
|
||||
#include "txbuf.h"
|
||||
|
||||
// We performed an AtomicReadFile Request,
|
||||
// and here is the data from the server
|
||||
// Note: it does not have to be the same file=instance
|
||||
// that someone can read from us. It is common to
|
||||
// use the description as the file name.
|
||||
/* We performed an AtomicReadFile Request, */
|
||||
/* and here is the data from the server */
|
||||
/* Note: it does not have to be the same file=instance */
|
||||
/* that someone can read from us. It is common to */
|
||||
/* use the description as the file name. */
|
||||
#if BACFILE
|
||||
void handler_atomic_read_file_ack(uint8_t * service_request,
|
||||
uint16_t service_len,
|
||||
@@ -58,13 +58,13 @@ void handler_atomic_read_file_ack(uint8_t * service_request,
|
||||
uint32_t instance = 0;
|
||||
|
||||
(void) src;
|
||||
// get the file instance from the tsm data before freeing it
|
||||
/* get the file instance from the tsm data before freeing it */
|
||||
instance = bacfile_instance_from_tsm(service_data->invoke_id);
|
||||
len = arf_ack_decode_service_request(service_request,
|
||||
service_len, &data);
|
||||
fprintf(stderr, "Received Read-File Ack!\n");
|
||||
if ((len > 0) && (instance <= BACNET_MAX_INSTANCE)) {
|
||||
// write the data received to the file specified
|
||||
/* write the data received to the file specified */
|
||||
if (data.access == FILE_STREAM_ACCESS) {
|
||||
pFilename = bacfile_name(instance);
|
||||
if (pFilename) {
|
||||
@@ -81,7 +81,7 @@ void handler_atomic_read_file_ack(uint8_t * service_request,
|
||||
}
|
||||
}
|
||||
} else if (data.access == FILE_RECORD_ACCESS) {
|
||||
// FIXME: add handling for Record Access
|
||||
/* FIXME: add handling for Record Access */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,7 +52,7 @@ void handler_device_communication_control(uint8_t * service_request,
|
||||
BACNET_ADDRESS my_address;
|
||||
int bytes_sent = 0;
|
||||
|
||||
// decode the service request only
|
||||
/* decode the service request only */
|
||||
len = dcc_decode_service_request(service_request,
|
||||
service_len, &timeDuration, &state, &password);
|
||||
fprintf(stderr, "DeviceCommunicationControl!\n");
|
||||
@@ -64,12 +64,12 @@ void handler_device_communication_control(uint8_t * service_request,
|
||||
else
|
||||
fprintf(stderr, "DeviceCommunicationControl: "
|
||||
"Unable to decode request!\n");
|
||||
// prepare a reply
|
||||
/* prepare a reply */
|
||||
datalink_get_my_address(&my_address);
|
||||
// encode the NPDU portion of the packet
|
||||
pdu_len = npdu_encode_apdu(&Handler_Transmit_Buffer[0], src, &my_address, false, // true for confirmed messages
|
||||
/* encode the NPDU portion of the packet */
|
||||
pdu_len = npdu_encode_apdu(&Handler_Transmit_Buffer[0], src, &my_address, false, /* true for confirmed messages */
|
||||
MESSAGE_PRIORITY_NORMAL);
|
||||
// bad decoding or something we didn't understand - send an abort
|
||||
/* bad decoding or something we didn't understand - send an abort */
|
||||
if (len == -1) {
|
||||
pdu_len += abort_encode_apdu(&Handler_Transmit_Buffer[pdu_len],
|
||||
service_data->invoke_id, ABORT_REASON_OTHER);
|
||||
@@ -105,8 +105,8 @@ void handler_device_communication_control(uint8_t * service_request,
|
||||
"Sending Error - password failure.\n");
|
||||
}
|
||||
}
|
||||
bytes_sent = datalink_send_pdu(src, // destination address
|
||||
&Handler_Transmit_Buffer[0], pdu_len); // number of bytes of data
|
||||
bytes_sent = datalink_send_pdu(src, /* destination address */
|
||||
&Handler_Transmit_Buffer[0], pdu_len); /* number of bytes of data */
|
||||
if (bytes_sent <= 0)
|
||||
fprintf(stderr, "DeviceCommunicationControl: "
|
||||
"Failed to send PDU (%s)!\n", strerror(errno));
|
||||
|
||||
@@ -66,7 +66,7 @@ void handler_i_am_bind(uint8_t * service_request,
|
||||
(void) service_len;
|
||||
len = iam_decode_service_request(service_request,
|
||||
&device_id, &max_apdu, &segmentation, &vendor_id);
|
||||
// only add address if requested to bind
|
||||
/* only add address if requested to bind */
|
||||
address_add_binding(device_id, max_apdu, src);
|
||||
|
||||
return;
|
||||
|
||||
@@ -51,7 +51,7 @@ void handler_reinitialize_device(uint8_t * service_request,
|
||||
BACNET_ADDRESS my_address;
|
||||
int bytes_sent = 0;
|
||||
|
||||
// decode the service request only
|
||||
/* decode the service request only */
|
||||
len = rd_decode_service_request(service_request,
|
||||
service_len, &state, &password);
|
||||
fprintf(stderr, "ReinitializeDevice!\n");
|
||||
@@ -60,12 +60,12 @@ void handler_reinitialize_device(uint8_t * service_request,
|
||||
(unsigned) state, characterstring_value(&password));
|
||||
else
|
||||
fprintf(stderr, "ReinitializeDevice: Unable to decode request!\n");
|
||||
// prepare a reply
|
||||
/* prepare a reply */
|
||||
datalink_get_my_address(&my_address);
|
||||
// encode the NPDU portion of the packet
|
||||
pdu_len = npdu_encode_apdu(&Handler_Transmit_Buffer[0], src, &my_address, false, // true for confirmed messages
|
||||
/* encode the NPDU portion of the packet */
|
||||
pdu_len = npdu_encode_apdu(&Handler_Transmit_Buffer[0], src, &my_address, false, /* true for confirmed messages */
|
||||
MESSAGE_PRIORITY_NORMAL);
|
||||
// bad decoding or something we didn't understand - send an abort
|
||||
/* bad decoding or something we didn't understand - send an abort */
|
||||
if (len == -1) {
|
||||
pdu_len += abort_encode_apdu(&Handler_Transmit_Buffer[pdu_len],
|
||||
service_data->invoke_id, ABORT_REASON_OTHER);
|
||||
@@ -103,8 +103,8 @@ void handler_reinitialize_device(uint8_t * service_request,
|
||||
"ReinitializeDevice: Sending Error - password failure.\n");
|
||||
}
|
||||
}
|
||||
bytes_sent = datalink_send_pdu(src, // destination address
|
||||
&Handler_Transmit_Buffer[0], pdu_len); // number of bytes of data
|
||||
bytes_sent = datalink_send_pdu(src, /* destination address */
|
||||
&Handler_Transmit_Buffer[0], pdu_len); /* number of bytes of data */
|
||||
if (bytes_sent <= 0)
|
||||
fprintf(stderr, "ReinitializeDevice: Failed to send PDU (%s)!\n",
|
||||
strerror(errno));
|
||||
|
||||
@@ -62,12 +62,12 @@ void handler_read_property(uint8_t * service_request,
|
||||
len = rp_decode_service_request(service_request, service_len, &data);
|
||||
if (len <= 0)
|
||||
fprintf(stderr, "Unable to decode Read-Property Request!\n");
|
||||
// prepare a reply
|
||||
/* prepare a reply */
|
||||
datalink_get_my_address(&my_address);
|
||||
// encode the NPDU portion of the packet
|
||||
pdu_len = npdu_encode_apdu(&Handler_Transmit_Buffer[0], src, &my_address, false, // true for confirmed messages
|
||||
/* encode the NPDU portion of the packet */
|
||||
pdu_len = npdu_encode_apdu(&Handler_Transmit_Buffer[0], src, &my_address, false, /* true for confirmed messages */
|
||||
MESSAGE_PRIORITY_NORMAL);
|
||||
// bad decoding - send an abort
|
||||
/* bad decoding - send an abort */
|
||||
if (len == -1) {
|
||||
pdu_len += abort_encode_apdu(&Handler_Transmit_Buffer[pdu_len],
|
||||
service_data->invoke_id, ABORT_REASON_OTHER);
|
||||
@@ -82,16 +82,16 @@ void handler_read_property(uint8_t * service_request,
|
||||
} else {
|
||||
switch (data.object_type) {
|
||||
case OBJECT_DEVICE:
|
||||
// FIXME: probably need a length limitation sent with encode
|
||||
/* FIXME: probably need a length limitation sent with encode */
|
||||
if (data.object_instance == Device_Object_Instance_Number()) {
|
||||
len = Device_Encode_Property_APDU(&Temp_Buf[0],
|
||||
data.object_property,
|
||||
data.array_index, &error_class, &error_code);
|
||||
if (len >= 0) {
|
||||
// encode the APDU portion of the packet
|
||||
/* encode the APDU portion of the packet */
|
||||
data.application_data = &Temp_Buf[0];
|
||||
data.application_data_len = len;
|
||||
// FIXME: probably need a length limitation sent with encode
|
||||
/* FIXME: probably need a length limitation sent with encode */
|
||||
pdu_len +=
|
||||
rp_ack_encode_apdu(&Handler_Transmit_Buffer
|
||||
[pdu_len], service_data->invoke_id, &data);
|
||||
@@ -109,10 +109,10 @@ void handler_read_property(uint8_t * service_request,
|
||||
data.object_property,
|
||||
data.array_index, &error_class, &error_code);
|
||||
if (len >= 0) {
|
||||
// encode the APDU portion of the packet
|
||||
/* encode the APDU portion of the packet */
|
||||
data.application_data = &Temp_Buf[0];
|
||||
data.application_data_len = len;
|
||||
// FIXME: probably need a length limitation sent with encode
|
||||
/* FIXME: probably need a length limitation sent with encode */
|
||||
pdu_len +=
|
||||
rp_ack_encode_apdu(&Handler_Transmit_Buffer
|
||||
[pdu_len], service_data->invoke_id, &data);
|
||||
@@ -130,10 +130,10 @@ void handler_read_property(uint8_t * service_request,
|
||||
data.object_property,
|
||||
data.array_index, &error_class, &error_code);
|
||||
if (len >= 0) {
|
||||
// encode the APDU portion of the packet
|
||||
/* encode the APDU portion of the packet */
|
||||
data.application_data = &Temp_Buf[0];
|
||||
data.application_data_len = len;
|
||||
// FIXME: probably need a length limitation sent with encode
|
||||
/* FIXME: probably need a length limitation sent with encode */
|
||||
pdu_len +=
|
||||
rp_ack_encode_apdu(&Handler_Transmit_Buffer
|
||||
[pdu_len], service_data->invoke_id, &data);
|
||||
@@ -152,10 +152,10 @@ void handler_read_property(uint8_t * service_request,
|
||||
data.object_property,
|
||||
data.array_index, &error_class, &error_code);
|
||||
if (len >= 0) {
|
||||
// encode the APDU portion of the packet
|
||||
/* encode the APDU portion of the packet */
|
||||
data.application_data = &Temp_Buf[0];
|
||||
data.application_data_len = len;
|
||||
// FIXME: probably need a length limitation sent with encode
|
||||
/* FIXME: probably need a length limitation sent with encode */
|
||||
pdu_len +=
|
||||
rp_ack_encode_apdu(&Handler_Transmit_Buffer
|
||||
[pdu_len], service_data->invoke_id, &data);
|
||||
@@ -180,8 +180,8 @@ void handler_read_property(uint8_t * service_request,
|
||||
send = true;
|
||||
}
|
||||
if (send) {
|
||||
bytes_sent = datalink_send_pdu(src, // destination address
|
||||
&Handler_Transmit_Buffer[0], pdu_len); // number of bytes of data
|
||||
bytes_sent = datalink_send_pdu(src, /* destination address */
|
||||
&Handler_Transmit_Buffer[0], pdu_len); /* number of bytes of data */
|
||||
if (bytes_sent <= 0)
|
||||
fprintf(stderr, "Failed to send PDU (%s)!\n", strerror(errno));
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@ void handler_write_property(uint8_t * service_request,
|
||||
BACNET_ERROR_CODE error_code = ERROR_CODE_UNKNOWN_OBJECT;
|
||||
int bytes_sent = 0;
|
||||
|
||||
// decode the service request only
|
||||
/* decode the service request only */
|
||||
len = wp_decode_service_request(service_request,
|
||||
service_len, &wp_data);
|
||||
fprintf(stderr, "Received Write-Property Request!\n");
|
||||
@@ -66,12 +66,12 @@ void handler_write_property(uint8_t * service_request,
|
||||
wp_data.object_property, wp_data.array_index);
|
||||
else
|
||||
fprintf(stderr, "Unable to decode Write-Property Request!\n");
|
||||
// prepare a reply
|
||||
/* prepare a reply */
|
||||
datalink_get_my_address(&my_address);
|
||||
// encode the NPDU portion of the packet
|
||||
pdu_len = npdu_encode_apdu(&Handler_Transmit_Buffer[0], src, &my_address, false, // true for confirmed messages
|
||||
/* encode the NPDU portion of the packet */
|
||||
pdu_len = npdu_encode_apdu(&Handler_Transmit_Buffer[0], src, &my_address, false, /* true for confirmed messages */
|
||||
MESSAGE_PRIORITY_NORMAL);
|
||||
// bad decoding or something we didn't understand - send an abort
|
||||
/* bad decoding or something we didn't understand - send an abort */
|
||||
if (len == -1) {
|
||||
pdu_len += abort_encode_apdu(&Handler_Transmit_Buffer[pdu_len],
|
||||
service_data->invoke_id, ABORT_REASON_OTHER);
|
||||
@@ -134,8 +134,8 @@ void handler_write_property(uint8_t * service_request,
|
||||
break;
|
||||
}
|
||||
}
|
||||
bytes_sent = datalink_send_pdu(src, // destination address
|
||||
&Handler_Transmit_Buffer[0], pdu_len); // number of bytes of data
|
||||
bytes_sent = datalink_send_pdu(src, /* destination address */
|
||||
&Handler_Transmit_Buffer[0], pdu_len); /* number of bytes of data */
|
||||
if (bytes_sent <= 0)
|
||||
fprintf(stderr, "Failed to send PDU (%s)!\n", strerror(errno));
|
||||
|
||||
|
||||
@@ -46,16 +46,16 @@ void handler_unrecognized_service(uint8_t * service_request,
|
||||
(void) service_len;
|
||||
datalink_get_my_address(&src);
|
||||
|
||||
// encode the NPDU portion of the packet
|
||||
pdu_len = npdu_encode_apdu(&Handler_Transmit_Buffer[0], dest, &src, false, // true for confirmed messages
|
||||
/* encode the NPDU portion of the packet */
|
||||
pdu_len = npdu_encode_apdu(&Handler_Transmit_Buffer[0], dest, &src, false, /* true for confirmed messages */
|
||||
MESSAGE_PRIORITY_NORMAL);
|
||||
|
||||
// encode the APDU portion of the packet
|
||||
/* encode the APDU portion of the packet */
|
||||
pdu_len += reject_encode_apdu(&Handler_Transmit_Buffer[pdu_len],
|
||||
service_data->invoke_id, REJECT_REASON_UNRECOGNIZED_SERVICE);
|
||||
|
||||
bytes_sent = datalink_send_pdu(dest, // destination address
|
||||
&Handler_Transmit_Buffer[0], pdu_len); // number of bytes of data
|
||||
bytes_sent = datalink_send_pdu(dest, /* destination address */
|
||||
&Handler_Transmit_Buffer[0], pdu_len); /* number of bytes of data */
|
||||
if (bytes_sent > 0)
|
||||
fprintf(stderr, "Sent Reject!\n");
|
||||
else
|
||||
|
||||
@@ -63,11 +63,11 @@ uint8_t Send_Device_Communication_Control_Request(uint32_t device_id, uint16_t t
|
||||
status = tsm_transaction_available();
|
||||
if (status) {
|
||||
datalink_get_my_address(&my_address);
|
||||
pdu_len = npdu_encode_apdu(&Handler_Transmit_Buffer[0], &dest, &my_address, true, // true for confirmed messages
|
||||
pdu_len = npdu_encode_apdu(&Handler_Transmit_Buffer[0], &dest, &my_address, true, /* true for confirmed messages */
|
||||
MESSAGE_PRIORITY_NORMAL);
|
||||
|
||||
invoke_id = tsm_next_free_invokeID();
|
||||
// load the data for the encoding
|
||||
/* load the data for the encoding */
|
||||
characterstring_init_ansi(&password_string, password);
|
||||
pdu_len += dcc_encode_apdu(&Handler_Transmit_Buffer[pdu_len],
|
||||
invoke_id,
|
||||
@@ -80,8 +80,8 @@ uint8_t Send_Device_Communication_Control_Request(uint32_t device_id, uint16_t t
|
||||
if ((unsigned) pdu_len < max_apdu) {
|
||||
tsm_set_confirmed_unsegmented_transaction(invoke_id,
|
||||
&dest, &Handler_Transmit_Buffer[0], pdu_len);
|
||||
bytes_sent = datalink_send_pdu(&dest, // destination address
|
||||
&Handler_Transmit_Buffer[0], pdu_len); // number of bytes of data
|
||||
bytes_sent = datalink_send_pdu(&dest, /* destination address */
|
||||
&Handler_Transmit_Buffer[0], pdu_len); /* number of bytes of data */
|
||||
if (bytes_sent <= 0)
|
||||
fprintf(stderr,
|
||||
"Failed to Send DeviceCommunicationControl Request (%s)!\n",
|
||||
|
||||
@@ -68,8 +68,8 @@ void Send_I_Have(uint32_t device_id,
|
||||
characterstring_init_ansi(&data.object_name, object_name);
|
||||
pdu_len += ihave_encode_apdu(&Handler_Transmit_Buffer[pdu_len], &data);
|
||||
/* send the data */
|
||||
bytes_sent = datalink_send_pdu(&dest, // destination address
|
||||
&Handler_Transmit_Buffer[0], pdu_len); // number of bytes of data
|
||||
bytes_sent = datalink_send_pdu(&dest, /* destination address */
|
||||
&Handler_Transmit_Buffer[0], pdu_len); /* number of bytes of data */
|
||||
if (bytes_sent <= 0)
|
||||
fprintf(stderr, "Failed to Send I-Have Reply (%s)!\n",
|
||||
strerror(errno));
|
||||
|
||||
@@ -64,11 +64,11 @@ uint8_t Send_Reinitialize_Device_Request(uint32_t device_id,
|
||||
status = tsm_transaction_available();
|
||||
if (status) {
|
||||
datalink_get_my_address(&my_address);
|
||||
pdu_len = npdu_encode_apdu(&Handler_Transmit_Buffer[0], &dest, &my_address, true, // true for confirmed messages
|
||||
pdu_len = npdu_encode_apdu(&Handler_Transmit_Buffer[0], &dest, &my_address, true, /* true for confirmed messages */
|
||||
MESSAGE_PRIORITY_NORMAL);
|
||||
|
||||
invoke_id = tsm_next_free_invokeID();
|
||||
// load the data for the encoding
|
||||
/* load the data for the encoding */
|
||||
characterstring_init_ansi(&password_string, password);
|
||||
pdu_len += rd_encode_apdu(&Handler_Transmit_Buffer[pdu_len],
|
||||
invoke_id, state, password ? &password_string : NULL);
|
||||
@@ -80,8 +80,8 @@ uint8_t Send_Reinitialize_Device_Request(uint32_t device_id,
|
||||
if ((unsigned) pdu_len < max_apdu) {
|
||||
tsm_set_confirmed_unsegmented_transaction(invoke_id,
|
||||
&dest, &Handler_Transmit_Buffer[0], pdu_len);
|
||||
bytes_sent = datalink_send_pdu(&dest, // destination address
|
||||
&Handler_Transmit_Buffer[0], pdu_len); // number of bytes of data
|
||||
bytes_sent = datalink_send_pdu(&dest, /* destination address */
|
||||
&Handler_Transmit_Buffer[0], pdu_len); /* number of bytes of data */
|
||||
if (bytes_sent <= 0)
|
||||
fprintf(stderr,
|
||||
"Failed to Send ReinitializeDevice Request (%s)!\n",
|
||||
|
||||
@@ -67,11 +67,11 @@ uint8_t Send_Read_Property_Request(uint32_t device_id, /* destination device */
|
||||
status = tsm_transaction_available();
|
||||
if (status) {
|
||||
datalink_get_my_address(&my_address);
|
||||
pdu_len = npdu_encode_apdu(&Handler_Transmit_Buffer[0], &dest, &my_address, true, // true for confirmed messages
|
||||
pdu_len = npdu_encode_apdu(&Handler_Transmit_Buffer[0], &dest, &my_address, true, /* true for confirmed messages */
|
||||
MESSAGE_PRIORITY_NORMAL);
|
||||
|
||||
invoke_id = tsm_next_free_invokeID();
|
||||
// load the data for the encoding
|
||||
/* load the data for the encoding */
|
||||
data.object_type = object_type;
|
||||
data.object_instance = object_instance;
|
||||
data.object_property = object_property;
|
||||
@@ -86,8 +86,8 @@ uint8_t Send_Read_Property_Request(uint32_t device_id, /* destination device */
|
||||
if ((unsigned) pdu_len < max_apdu) {
|
||||
tsm_set_confirmed_unsegmented_transaction(invoke_id,
|
||||
&dest, &Handler_Transmit_Buffer[0], pdu_len);
|
||||
bytes_sent = datalink_send_pdu(&dest, // destination address
|
||||
&Handler_Transmit_Buffer[0], pdu_len); // number of bytes of data
|
||||
bytes_sent = datalink_send_pdu(&dest, /* destination address */
|
||||
&Handler_Transmit_Buffer[0], pdu_len); /* number of bytes of data */
|
||||
if (bytes_sent <= 0)
|
||||
fprintf(stderr,
|
||||
"Failed to Send ReadProperty Request (%s)!\n",
|
||||
|
||||
@@ -67,8 +67,8 @@ void Send_WhoHas_Name(int32_t low_limit,
|
||||
pdu_len += whohas_encode_apdu(&Handler_Transmit_Buffer[pdu_len],
|
||||
&data);
|
||||
/* send the data */
|
||||
bytes_sent = datalink_send_pdu(&dest, // destination address
|
||||
&Handler_Transmit_Buffer[0], pdu_len); // number of bytes of data
|
||||
bytes_sent = datalink_send_pdu(&dest, /* destination address */
|
||||
&Handler_Transmit_Buffer[0], pdu_len); /* number of bytes of data */
|
||||
if (bytes_sent <= 0)
|
||||
fprintf(stderr, "Failed to Send Who-Has Request (%s)!\n",
|
||||
strerror(errno));
|
||||
@@ -101,8 +101,8 @@ void Send_WhoHas_Object(int32_t low_limit,
|
||||
pdu_len += whohas_encode_apdu(&Handler_Transmit_Buffer[pdu_len],
|
||||
&data);
|
||||
/* send the data */
|
||||
bytes_sent = datalink_send_pdu(&dest, // destination address
|
||||
&Handler_Transmit_Buffer[0], pdu_len); // number of bytes of data
|
||||
bytes_sent = datalink_send_pdu(&dest, /* destination address */
|
||||
&Handler_Transmit_Buffer[0], pdu_len); /* number of bytes of data */
|
||||
if (bytes_sent <= 0)
|
||||
fprintf(stderr, "Failed to Send Who-Has Request (%s)!\n",
|
||||
strerror(errno));
|
||||
|
||||
@@ -52,19 +52,19 @@ void Send_WhoIs(int32_t low_limit, int32_t high_limit)
|
||||
if (!dcc_communication_enabled())
|
||||
return;
|
||||
|
||||
// Who-Is is a global broadcast
|
||||
/* Who-Is is a global broadcast */
|
||||
datalink_get_broadcast_address(&dest);
|
||||
|
||||
// encode the NPDU portion of the packet
|
||||
pdu_len = npdu_encode_apdu(&Handler_Transmit_Buffer[0], &dest, NULL, false, // true for confirmed messages
|
||||
/* encode the NPDU portion of the packet */
|
||||
pdu_len = npdu_encode_apdu(&Handler_Transmit_Buffer[0], &dest, NULL, false, /* true for confirmed messages */
|
||||
MESSAGE_PRIORITY_NORMAL);
|
||||
|
||||
// encode the APDU portion of the packet
|
||||
/* encode the APDU portion of the packet */
|
||||
pdu_len += whois_encode_apdu(&Handler_Transmit_Buffer[pdu_len],
|
||||
low_limit, high_limit);
|
||||
|
||||
bytes_sent = datalink_send_pdu(&dest, // destination address
|
||||
&Handler_Transmit_Buffer[0], pdu_len); // number of bytes of data
|
||||
bytes_sent = datalink_send_pdu(&dest, /* destination address */
|
||||
&Handler_Transmit_Buffer[0], pdu_len); /* number of bytes of data */
|
||||
if (bytes_sent <= 0)
|
||||
fprintf(stderr, "Failed to Send Who-Is Request (%s)!\n",
|
||||
strerror(errno));
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
#include "txbuf.h"
|
||||
|
||||
/* returns the invoke ID for confirmed request, or zero on failure */
|
||||
uint8_t Send_Write_Property_Request(uint32_t device_id, // destination device
|
||||
uint8_t Send_Write_Property_Request(uint32_t device_id, /* destination device */
|
||||
BACNET_OBJECT_TYPE object_type,
|
||||
uint32_t object_instance,
|
||||
BACNET_PROPERTY_ID object_property,
|
||||
@@ -69,11 +69,11 @@ uint8_t Send_Write_Property_Request(uint32_t device_id, // destination device
|
||||
status = tsm_transaction_available();
|
||||
if (status) {
|
||||
datalink_get_my_address(&my_address);
|
||||
pdu_len = npdu_encode_apdu(&Handler_Transmit_Buffer[0], &dest, &my_address, true, // true for confirmed messages
|
||||
pdu_len = npdu_encode_apdu(&Handler_Transmit_Buffer[0], &dest, &my_address, true, /* true for confirmed messages */
|
||||
MESSAGE_PRIORITY_NORMAL);
|
||||
|
||||
invoke_id = tsm_next_free_invokeID();
|
||||
// load the data for the encoding
|
||||
/* load the data for the encoding */
|
||||
data.object_type = object_type;
|
||||
data.object_instance = object_instance;
|
||||
data.object_property = object_property;
|
||||
@@ -90,8 +90,8 @@ uint8_t Send_Write_Property_Request(uint32_t device_id, // destination device
|
||||
if ((unsigned) pdu_len < max_apdu) {
|
||||
tsm_set_confirmed_unsegmented_transaction(invoke_id,
|
||||
&dest, &Handler_Transmit_Buffer[0], pdu_len);
|
||||
bytes_sent = datalink_send_pdu(&dest, // destination address
|
||||
&Handler_Transmit_Buffer[0], pdu_len); // number of bytes of data
|
||||
bytes_sent = datalink_send_pdu(&dest, /* destination address */
|
||||
&Handler_Transmit_Buffer[0], pdu_len); /* number of bytes of data */
|
||||
if (bytes_sent <= 0)
|
||||
fprintf(stderr,
|
||||
"Failed to Send WriteProperty Request (%s)!\n",
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
*
|
||||
*********************************************************************/
|
||||
|
||||
// Analog Input Objects customize for your use
|
||||
/* Analog Input Objects customize for your use */
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
@@ -31,13 +31,13 @@
|
||||
#include "bacdef.h"
|
||||
#include "bacdcode.h"
|
||||
#include "bacenum.h"
|
||||
#include "config.h" // the custom stuff
|
||||
#include "config.h" /* the custom stuff */
|
||||
|
||||
#define MAX_ANALOG_INPUTS 7
|
||||
|
||||
// we simply have 0-n object instances. Yours might be
|
||||
// more complex, and then you need validate that the
|
||||
// given instance exists
|
||||
/* we simply have 0-n object instances. Yours might be */
|
||||
/* more complex, and then you need validate that the */
|
||||
/* given instance exists */
|
||||
bool Analog_Input_Valid_Instance(uint32_t object_instance)
|
||||
{
|
||||
if (object_instance < MAX_ANALOG_INPUTS)
|
||||
@@ -46,16 +46,16 @@ bool Analog_Input_Valid_Instance(uint32_t object_instance)
|
||||
return false;
|
||||
}
|
||||
|
||||
// we simply have 0-n object instances. Yours might be
|
||||
// more complex, and then count how many you have
|
||||
/* we simply have 0-n object instances. Yours might be */
|
||||
/* more complex, and then count how many you have */
|
||||
unsigned Analog_Input_Count(void)
|
||||
{
|
||||
return MAX_ANALOG_INPUTS;
|
||||
}
|
||||
|
||||
// we simply have 0-n object instances. Yours might be
|
||||
// more complex, and then you need to return the instance
|
||||
// that correlates to the correct index
|
||||
/* we simply have 0-n object instances. Yours might be */
|
||||
/* more complex, and then you need to return the instance */
|
||||
/* that correlates to the correct index */
|
||||
uint32_t Analog_Input_Index_To_Instance(unsigned index)
|
||||
{
|
||||
return index;
|
||||
@@ -81,7 +81,7 @@ int Analog_Input_Encode_Property_APDU(uint8_t * apdu,
|
||||
int32_t array_index,
|
||||
BACNET_ERROR_CLASS * error_class, BACNET_ERROR_CODE * error_code)
|
||||
{
|
||||
int apdu_len = 0; // return value
|
||||
int apdu_len = 0; /* return value */
|
||||
BACNET_BIT_STRING bit_string;
|
||||
BACNET_CHARACTER_STRING char_string;
|
||||
float value = 3.14;
|
||||
@@ -149,7 +149,7 @@ void testAnalogInput(Test * pTest)
|
||||
BACNET_ERROR_CODE error_code;
|
||||
|
||||
|
||||
// FIXME: we should do a lot more testing here...
|
||||
/* FIXME: we should do a lot more testing here... */
|
||||
len = Analog_Input_Encode_Property_APDU(&apdu[0],
|
||||
instance,
|
||||
PROP_OBJECT_IDENTIFIER,
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
*
|
||||
*********************************************************************/
|
||||
|
||||
// Analog Output Objects - customize for your use
|
||||
/* Analog Output Objects - customize for your use */
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
@@ -31,28 +31,28 @@
|
||||
#include "bacdef.h"
|
||||
#include "bacdcode.h"
|
||||
#include "bacenum.h"
|
||||
#include "config.h" // the custom stuff
|
||||
#include "config.h" /* the custom stuff */
|
||||
#include "wp.h"
|
||||
|
||||
#define MAX_ANALOG_OUTPUTS 4
|
||||
|
||||
// we choose to have a NULL level in our system represented by
|
||||
// a particular value. When the priorities are not in use, they
|
||||
// will be relinquished (i.e. set to the NULL level).
|
||||
/* we choose to have a NULL level in our system represented by */
|
||||
/* a particular value. When the priorities are not in use, they */
|
||||
/* will be relinquished (i.e. set to the NULL level). */
|
||||
#define AO_LEVEL_NULL 255
|
||||
// When all the priorities are level null, the present value returns
|
||||
// the Relinquish Default value
|
||||
/* When all the priorities are level null, the present value returns */
|
||||
/* the Relinquish Default value */
|
||||
#define AO_RELINQUISH_DEFAULT 0
|
||||
// Here is our Priority Array. They are supposed to be Real, but
|
||||
// we don't have that kind of memory, so we will use a single byte
|
||||
// and load a Real for returning the value when asked.
|
||||
/* Here is our Priority Array. They are supposed to be Real, but */
|
||||
/* we don't have that kind of memory, so we will use a single byte */
|
||||
/* and load a Real for returning the value when asked. */
|
||||
static uint8_t
|
||||
Analog_Output_Level[MAX_ANALOG_OUTPUTS][BACNET_MAX_PRIORITY];
|
||||
// Writable out-of-service allows others to play with our Present Value
|
||||
// without changing the physical output
|
||||
/* Writable out-of-service allows others to play with our Present Value */
|
||||
/* without changing the physical output */
|
||||
static bool Analog_Output_Out_Of_Service[MAX_ANALOG_OUTPUTS];
|
||||
|
||||
// we need to have our arrays initialized before answering any calls
|
||||
/* we need to have our arrays initialized before answering any calls */
|
||||
static bool Analog_Ouput_Initialized = false;
|
||||
|
||||
void Analog_Output_Init(void)
|
||||
@@ -62,7 +62,7 @@ void Analog_Output_Init(void)
|
||||
if (!Analog_Ouput_Initialized) {
|
||||
Analog_Ouput_Initialized = true;
|
||||
|
||||
// initialize all the analog output priority arrays to NULL
|
||||
/* initialize all the analog output priority arrays to NULL */
|
||||
for (i = 0; i < MAX_ANALOG_OUTPUTS; i++) {
|
||||
for (j = 0; j < BACNET_MAX_PRIORITY; j++) {
|
||||
Analog_Output_Level[i][j] = AO_LEVEL_NULL;
|
||||
@@ -73,9 +73,9 @@ void Analog_Output_Init(void)
|
||||
return;
|
||||
}
|
||||
|
||||
// we simply have 0-n object instances. Yours might be
|
||||
// more complex, and then you need validate that the
|
||||
// given instance exists
|
||||
/* we simply have 0-n object instances. Yours might be */
|
||||
/* more complex, and then you need validate that the */
|
||||
/* given instance exists */
|
||||
bool Analog_Output_Valid_Instance(uint32_t object_instance)
|
||||
{
|
||||
Analog_Output_Init();
|
||||
@@ -85,26 +85,26 @@ bool Analog_Output_Valid_Instance(uint32_t object_instance)
|
||||
return false;
|
||||
}
|
||||
|
||||
// we simply have 0-n object instances. Yours might be
|
||||
// more complex, and then count how many you have
|
||||
/* we simply have 0-n object instances. Yours might be */
|
||||
/* more complex, and then count how many you have */
|
||||
unsigned Analog_Output_Count(void)
|
||||
{
|
||||
Analog_Output_Init();
|
||||
return MAX_ANALOG_OUTPUTS;
|
||||
}
|
||||
|
||||
// we simply have 0-n object instances. Yours might be
|
||||
// more complex, and then you need to return the instance
|
||||
// that correlates to the correct index
|
||||
/* we simply have 0-n object instances. Yours might be */
|
||||
/* more complex, and then you need to return the instance */
|
||||
/* that correlates to the correct index */
|
||||
uint32_t Analog_Output_Index_To_Instance(unsigned index)
|
||||
{
|
||||
Analog_Output_Init();
|
||||
return index;
|
||||
}
|
||||
|
||||
// we simply have 0-n object instances. Yours might be
|
||||
// more complex, and then you need to return the index
|
||||
// that correlates to the correct instance number
|
||||
/* we simply have 0-n object instances. Yours might be */
|
||||
/* more complex, and then you need to return the index */
|
||||
/* that correlates to the correct instance number */
|
||||
unsigned Analog_Output_Instance_To_Index(uint32_t object_instance)
|
||||
{
|
||||
unsigned index = MAX_ANALOG_OUTPUTS;
|
||||
@@ -157,7 +157,7 @@ int Analog_Output_Encode_Property_APDU(uint8_t * apdu,
|
||||
BACNET_ERROR_CLASS * error_class, BACNET_ERROR_CODE * error_code)
|
||||
{
|
||||
int len = 0;
|
||||
int apdu_len = 0; // return value
|
||||
int apdu_len = 0; /* return value */
|
||||
BACNET_BIT_STRING bit_string;
|
||||
BACNET_CHARACTER_STRING char_string;
|
||||
float real_value = 1.414;
|
||||
@@ -202,24 +202,24 @@ int Analog_Output_Encode_Property_APDU(uint8_t * apdu,
|
||||
apdu_len = encode_tagged_enumerated(&apdu[0], UNITS_PERCENT);
|
||||
break;
|
||||
case PROP_PRIORITY_ARRAY:
|
||||
// Array element zero is the number of elements in the array
|
||||
/* Array element zero is the number of elements in the array */
|
||||
if (array_index == BACNET_ARRAY_LENGTH_INDEX)
|
||||
apdu_len =
|
||||
encode_tagged_unsigned(&apdu[0], BACNET_MAX_PRIORITY);
|
||||
// if no index was specified, then try to encode the entire list
|
||||
// into one packet.
|
||||
/* if no index was specified, then try to encode the entire list */
|
||||
/* into one packet. */
|
||||
else if (array_index == BACNET_ARRAY_ALL) {
|
||||
object_index =
|
||||
Analog_Output_Instance_To_Index(object_instance);
|
||||
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 (Analog_Output_Level[object_index][i] == AO_LEVEL_NULL)
|
||||
len = encode_tagged_null(&apdu[apdu_len]);
|
||||
else {
|
||||
real_value = Analog_Output_Level[object_index][i];
|
||||
len = encode_tagged_real(&apdu[apdu_len], real_value);
|
||||
}
|
||||
// add it if we have room
|
||||
/* add it if we have room */
|
||||
if ((apdu_len + len) < MAX_APDU)
|
||||
apdu_len += len;
|
||||
else {
|
||||
@@ -263,11 +263,11 @@ int Analog_Output_Encode_Property_APDU(uint8_t * apdu,
|
||||
return apdu_len;
|
||||
}
|
||||
|
||||
// returns true if successful
|
||||
/* returns true if successful */
|
||||
bool Analog_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
|
||||
BACNET_ERROR_CLASS * error_class, BACNET_ERROR_CODE * error_code)
|
||||
{
|
||||
bool status = false; // return value
|
||||
bool status = false; /* return value */
|
||||
unsigned int object_index = 0;
|
||||
unsigned int priority = 0;
|
||||
uint8_t level = AO_LEVEL_NULL;
|
||||
@@ -278,7 +278,7 @@ bool Analog_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
|
||||
*error_code = ERROR_CODE_UNKNOWN_OBJECT;
|
||||
return false;
|
||||
}
|
||||
// decode the some of the request
|
||||
/* decode the some of the request */
|
||||
switch (wp_data->object_property) {
|
||||
case PROP_PRESENT_VALUE:
|
||||
if (wp_data->value.tag == BACNET_APPLICATION_TAG_REAL) {
|
||||
@@ -293,9 +293,9 @@ bool Analog_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
|
||||
object_instance);
|
||||
priority--;
|
||||
Analog_Output_Level[object_index][priority] = level;
|
||||
// if Out of Service is TRUE, then don't set the
|
||||
// physical output. This comment may apply to the
|
||||
// main loop (i.e. check out of service before changing output)
|
||||
/* if Out of Service is TRUE, then don't set the */
|
||||
/* physical output. This comment may apply to the */
|
||||
/* main loop (i.e. check out of service before changing output) */
|
||||
status = true;
|
||||
} else if (priority == 6) {
|
||||
*error_class = ERROR_CLASS_PROPERTY;
|
||||
|
||||
@@ -48,7 +48,7 @@ static BACNET_FILE_LISTING BACnet_File_Listing[] = {
|
||||
{0, "test.log"},
|
||||
{1, "script.txt"},
|
||||
{2, "bacenum.h"},
|
||||
{0, NULL} // last file indication
|
||||
{0, NULL} /* last file indication */
|
||||
};
|
||||
|
||||
char *bacfile_name(uint32_t instance)
|
||||
@@ -56,7 +56,7 @@ char *bacfile_name(uint32_t instance)
|
||||
uint32_t index = 0;
|
||||
char *filename = NULL;
|
||||
|
||||
// linear search for file instance match
|
||||
/* linear search for file instance match */
|
||||
while (BACnet_File_Listing[index].filename) {
|
||||
if (BACnet_File_Listing[index].instance == instance) {
|
||||
filename = BACnet_File_Listing[index].filename;
|
||||
@@ -77,7 +77,7 @@ uint32_t bacfile_count(void)
|
||||
{
|
||||
uint32_t index = 0;
|
||||
|
||||
// linear search for file instance match
|
||||
/* linear search for file instance match */
|
||||
while (BACnet_File_Listing[index].filename) {
|
||||
index++;
|
||||
}
|
||||
@@ -90,7 +90,7 @@ uint32_t bacfile_index_to_instance(unsigned find_index)
|
||||
uint32_t instance = BACNET_MAX_INSTANCE + 1;
|
||||
uint32_t index = 0;
|
||||
|
||||
// bounds checking...
|
||||
/* bounds checking... */
|
||||
while (BACnet_File_Listing[index].filename) {
|
||||
if (index == find_index) {
|
||||
instance = BACnet_File_Listing[index].instance;
|
||||
@@ -141,7 +141,7 @@ int bacfile_encode_property_apdu(uint8_t * apdu,
|
||||
int32_t array_index,
|
||||
BACNET_ERROR_CLASS * error_class, BACNET_ERROR_CODE * error_code)
|
||||
{
|
||||
int apdu_len = 0; // return value
|
||||
int apdu_len = 0; /* return value */
|
||||
char text_string[32] = { "" };
|
||||
BACNET_CHARACTER_STRING char_string;
|
||||
|
||||
@@ -173,18 +173,18 @@ int bacfile_encode_property_apdu(uint8_t * apdu,
|
||||
bacfile_file_size(object_instance));
|
||||
break;
|
||||
case PROP_MODIFICATION_DATE:
|
||||
// FIXME: get the actual value
|
||||
/* FIXME: get the actual value */
|
||||
apdu_len = encode_tagged_date(&apdu[0],
|
||||
2005, 12, 25, 7 /* sunday */ );
|
||||
// FIXME: get the actual value
|
||||
/* FIXME: get the actual value */
|
||||
apdu_len += encode_tagged_time(&apdu[apdu_len], 12, 0, 0, 0);
|
||||
break;
|
||||
case PROP_ARCHIVE:
|
||||
// FIXME: get the actual value: note it may be inverse...
|
||||
/* FIXME: get the actual value: note it may be inverse... */
|
||||
apdu_len = encode_tagged_boolean(&apdu[0], true);
|
||||
break;
|
||||
case PROP_READ_ONLY:
|
||||
// FIXME: get the actual value
|
||||
/* FIXME: get the actual value */
|
||||
apdu_len = encode_tagged_boolean(&apdu[0], true);
|
||||
break;
|
||||
case PROP_FILE_ACCESS_METHOD:
|
||||
@@ -205,7 +205,7 @@ uint32_t bacfile_instance(char *filename)
|
||||
uint32_t index = 0;
|
||||
uint32_t instance = BACNET_MAX_INSTANCE + 1;
|
||||
|
||||
// linear search for filename match
|
||||
/* linear search for filename match */
|
||||
while (BACnet_File_Listing[index].filename) {
|
||||
if (strcmp(BACnet_File_Listing[index].filename, filename) == 0) {
|
||||
instance = BACnet_File_Listing[index].instance;
|
||||
@@ -218,37 +218,37 @@ uint32_t bacfile_instance(char *filename)
|
||||
}
|
||||
|
||||
#if TSM_ENABLED
|
||||
// this is one way to match up the invoke ID with
|
||||
// the file ID from the AtomicReadFile request.
|
||||
// Another way would be to store the
|
||||
// invokeID and file instance in a list or table
|
||||
// when the request was sent
|
||||
/* this is one way to match up the invoke ID with */
|
||||
/* the file ID from the AtomicReadFile request. */
|
||||
/* Another way would be to store the */
|
||||
/* invokeID and file instance in a list or table */
|
||||
/* when the request was sent */
|
||||
uint32_t bacfile_instance_from_tsm(uint8_t invokeID)
|
||||
{
|
||||
BACNET_NPDU_DATA npdu_data = { 0 }; // dummy for getting npdu length
|
||||
BACNET_NPDU_DATA npdu_data = { 0 }; /* dummy for getting npdu length */
|
||||
BACNET_CONFIRMED_SERVICE_DATA service_data = { 0 };
|
||||
uint8_t service_choice = 0;
|
||||
uint8_t *service_request = NULL;
|
||||
uint16_t service_request_len = 0;
|
||||
BACNET_ADDRESS dest; // where the original packet was destined
|
||||
uint8_t pdu[MAX_PDU] = { 0 }; // original sent packet
|
||||
uint16_t pdu_len = 0; // original packet length
|
||||
uint16_t len = 0; // apdu header length
|
||||
BACNET_ADDRESS dest; /* where the original packet was destined */
|
||||
uint8_t pdu[MAX_PDU] = { 0 }; /* original sent packet */
|
||||
uint16_t pdu_len = 0; /* original packet length */
|
||||
uint16_t len = 0; /* apdu header length */
|
||||
BACNET_ATOMIC_READ_FILE_DATA data = { 0 };
|
||||
uint32_t object_instance = BACNET_MAX_INSTANCE + 1; // return value
|
||||
uint32_t object_instance = BACNET_MAX_INSTANCE + 1; /* return value */
|
||||
bool found = false;
|
||||
int apdu_offset = 0;
|
||||
|
||||
found = tsm_get_transaction_pdu(invokeID, &dest, &pdu[0], &pdu_len);
|
||||
if (found) {
|
||||
apdu_offset = npdu_decode(&pdu[0], // data to decode
|
||||
NULL, // destination address - get the DNET/DLEN/DADR if in there
|
||||
NULL, // source address - get the SNET/SLEN/SADR if in there
|
||||
&npdu_data); // amount of data to decode
|
||||
apdu_offset = npdu_decode(&pdu[0], /* data to decode */
|
||||
NULL, /* destination address - get the DNET/DLEN/DADR if in there */
|
||||
NULL, /* source address - get the SNET/SLEN/SADR if in there */
|
||||
&npdu_data); /* amount of data to decode */
|
||||
if (!npdu_data.network_layer_message &&
|
||||
((pdu[apdu_offset] & 0xF0) ==
|
||||
PDU_TYPE_CONFIRMED_SERVICE_REQUEST)) {
|
||||
len = apdu_decode_confirmed_service_request(&pdu[apdu_offset], // APDU data
|
||||
len = apdu_decode_confirmed_service_request(&pdu[apdu_offset], /* APDU data */
|
||||
pdu_len - apdu_offset,
|
||||
&service_data,
|
||||
&service_choice, &service_request, &service_request_len);
|
||||
|
||||
@@ -51,18 +51,18 @@ extern "C" {
|
||||
uint32_t bacfile_index_to_instance(unsigned find_index);
|
||||
uint32_t bacfile_instance(char *filename);
|
||||
#if TSM_ENABLED
|
||||
// this is one way to match up the invoke ID with
|
||||
// the file ID from the AtomicReadFile request.
|
||||
// Another way would be to store the
|
||||
// invokeID and file instance in a list or table
|
||||
// when the request was sent
|
||||
/* this is one way to match up the invoke ID with */
|
||||
/* the file ID from the AtomicReadFile request. */
|
||||
/* Another way would be to store the */
|
||||
/* invokeID and file instance in a list or table */
|
||||
/* when the request was sent */
|
||||
uint32_t bacfile_instance_from_tsm(uint8_t invokeID);
|
||||
#endif
|
||||
|
||||
// AtomicReadFile ACK helper
|
||||
/* AtomicReadFile ACK helper */
|
||||
bool bacfile_read_data(BACNET_ATOMIC_READ_FILE_DATA * data);
|
||||
|
||||
// handling for read property service
|
||||
/* handling for read property service */
|
||||
int bacfile_encode_property_apdu(uint8_t * apdu,
|
||||
uint32_t object_instance,
|
||||
BACNET_PROPERTY_ID property,
|
||||
|
||||
@@ -107,7 +107,7 @@ bool Device_Set_Object_Instance_Number(uint32_t object_id)
|
||||
|
||||
bool Device_Valid_Object_Instance_Number(uint32_t object_id)
|
||||
{
|
||||
// BACnet allows for a wildcard instance number
|
||||
/* BACnet allows for a wildcard instance number */
|
||||
return ((Object_Instance_Number == object_id) ||
|
||||
(object_id == BACNET_MAX_INSTANCE));
|
||||
}
|
||||
@@ -137,7 +137,7 @@ BACNET_DEVICE_STATUS Device_System_Status(void)
|
||||
|
||||
void Device_Set_System_Status(BACNET_DEVICE_STATUS status)
|
||||
{
|
||||
// FIXME: bounds check?
|
||||
/* FIXME: bounds check? */
|
||||
System_Status = status;
|
||||
}
|
||||
|
||||
@@ -285,7 +285,7 @@ uint16_t Device_APDU_Timeout(void)
|
||||
return APDU_Timeout;
|
||||
}
|
||||
|
||||
// in milliseconds
|
||||
/* in milliseconds */
|
||||
void Device_Set_APDU_Timeout(uint16_t timeout)
|
||||
{
|
||||
APDU_Timeout = timeout;
|
||||
@@ -311,8 +311,8 @@ void Device_Set_Database_Revision(uint8_t revision)
|
||||
Database_Revision = revision;
|
||||
}
|
||||
|
||||
// Since many network clients depend on the object list
|
||||
// for discovery, it must be consistent!
|
||||
/* Since many network clients depend on the object list */
|
||||
/* for discovery, it must be consistent! */
|
||||
unsigned Device_Object_List_Count(void)
|
||||
{
|
||||
unsigned count = 1;
|
||||
@@ -339,7 +339,7 @@ bool Device_Object_List_Identifier(unsigned array_index,
|
||||
}
|
||||
|
||||
if (!status) {
|
||||
// array index starts at 1, and 1 for the device object
|
||||
/* array index starts at 1, and 1 for the device object */
|
||||
object_index = array_index - 2;
|
||||
if (object_index < Analog_Input_Count()) {
|
||||
*object_type = OBJECT_ANALOG_INPUT;
|
||||
@@ -426,14 +426,14 @@ char *Device_Valid_Object_Id(int object_type, uint32_t object_instance)
|
||||
return name;
|
||||
}
|
||||
|
||||
// return the length of the apdu encoded or -1 for error
|
||||
/* return the length of the apdu encoded or -1 for error */
|
||||
int Device_Encode_Property_APDU(uint8_t * apdu,
|
||||
BACNET_PROPERTY_ID property,
|
||||
int32_t array_index,
|
||||
BACNET_ERROR_CLASS * error_class, BACNET_ERROR_CODE * error_code)
|
||||
{
|
||||
int apdu_len = 0; // return value
|
||||
int len = 0; // apdu len intermediate value
|
||||
int apdu_len = 0; /* return value */
|
||||
int len = 0; /* apdu len intermediate value */
|
||||
BACNET_BIT_STRING bit_string;
|
||||
BACNET_CHARACTER_STRING char_string;
|
||||
unsigned i = 0;
|
||||
@@ -480,31 +480,31 @@ int Device_Encode_Property_APDU(uint8_t * apdu,
|
||||
Application_Software_Version);
|
||||
apdu_len = encode_tagged_character_string(&apdu[0], &char_string);
|
||||
break;
|
||||
// if you support time
|
||||
//case PROP_LOCAL_TIME:
|
||||
//t = time(NULL);
|
||||
//my_tm = localtime(&t);
|
||||
//apdu_len =
|
||||
// encode_tagged_time(&apdu[0], my_tm->tm_hour, my_tm->tm_min,
|
||||
// my_tm->tm_sec, 0);
|
||||
//break;
|
||||
// if you support date
|
||||
//case PROP_LOCAL_DATE:
|
||||
//t = time(NULL);
|
||||
//my_tm = localtime(&t);
|
||||
// month 1=Jan
|
||||
// day = day of month
|
||||
// wday 1=Monday...7=Sunday
|
||||
//apdu_len = encode_tagged_date(&apdu[0],
|
||||
// my_tm->tm_year+1900,
|
||||
// my_tm->tm_mon + 1,
|
||||
// my_tm->tm_mday, ((my_tm->tm_wday == 0) ? 7 : my_tm->tm_wday));
|
||||
//break;
|
||||
/* if you support time */
|
||||
/*case PROP_LOCAL_TIME: */
|
||||
/*t = time(NULL); */
|
||||
/*my_tm = localtime(&t); */
|
||||
/*apdu_len = */
|
||||
/* encode_tagged_time(&apdu[0], my_tm->tm_hour, my_tm->tm_min, */
|
||||
/* my_tm->tm_sec, 0); */
|
||||
/*break; */
|
||||
/* if you support date */
|
||||
/*case PROP_LOCAL_DATE: */
|
||||
/*t = time(NULL); */
|
||||
/*my_tm = localtime(&t); */
|
||||
/* month 1=Jan */
|
||||
/* day = day of month */
|
||||
/* wday 1=Monday...7=Sunday */
|
||||
/*apdu_len = encode_tagged_date(&apdu[0], */
|
||||
/* my_tm->tm_year+1900, */
|
||||
/* my_tm->tm_mon + 1, */
|
||||
/* my_tm->tm_mday, ((my_tm->tm_wday == 0) ? 7 : my_tm->tm_wday)); */
|
||||
/*break; */
|
||||
case PROP_PROTOCOL_VERSION:
|
||||
apdu_len =
|
||||
encode_tagged_unsigned(&apdu[0], Device_Protocol_Version());
|
||||
break;
|
||||
// BACnet Legacy Support
|
||||
/* BACnet Legacy Support */
|
||||
case PROP_PROTOCOL_CONFORMANCE_CLASS:
|
||||
apdu_len = encode_tagged_unsigned(&apdu[0], 1);
|
||||
break;
|
||||
@@ -523,7 +523,7 @@ int Device_Encode_Property_APDU(uint8_t * apdu,
|
||||
not a list of objects that this device can access */
|
||||
bitstring_init(&bit_string);
|
||||
for (i = 0; i < MAX_ASHRAE_OBJECT_TYPE; i++) {
|
||||
// initialize all the object types to not-supported
|
||||
/* initialize all the object types to not-supported */
|
||||
bitstring_set_bit(&bit_string, (uint8_t) i, false);
|
||||
}
|
||||
/* FIXME: indicate the objects that YOU support */
|
||||
@@ -537,13 +537,13 @@ int Device_Encode_Property_APDU(uint8_t * apdu,
|
||||
break;
|
||||
case PROP_OBJECT_LIST:
|
||||
count = Device_Object_List_Count();
|
||||
// Array element zero is the number of objects in the list
|
||||
/* Array element zero is the number of objects in the list */
|
||||
if (array_index == BACNET_ARRAY_LENGTH_INDEX)
|
||||
apdu_len = encode_tagged_unsigned(&apdu[0], count);
|
||||
// if no index was specified, then try to encode the entire list
|
||||
// into one packet. Note that more than likely you will have
|
||||
// to return an error if the number of encoded objects exceeds
|
||||
// your maximum APDU size.
|
||||
/* if no index was specified, then try to encode the entire list */
|
||||
/* into one packet. Note that more than likely you will have */
|
||||
/* to return an error if the number of encoded objects exceeds */
|
||||
/* your maximum APDU size. */
|
||||
else if (array_index == BACNET_ARRAY_ALL) {
|
||||
for (i = 1; i <= count; i++) {
|
||||
if (Device_Object_List_Identifier(i, &object_type,
|
||||
@@ -552,8 +552,8 @@ int Device_Encode_Property_APDU(uint8_t * apdu,
|
||||
encode_tagged_object_id(&apdu[apdu_len],
|
||||
object_type, instance);
|
||||
apdu_len += len;
|
||||
// assume next one is the same size as this one
|
||||
// can we all fit into the APDU?
|
||||
/* assume next one is the same size as this one */
|
||||
/* can we all fit into the APDU? */
|
||||
if ((apdu_len + len) >= MAX_APDU) {
|
||||
*error_class = ERROR_CLASS_SERVICES;
|
||||
*error_code = ERROR_CODE_NO_SPACE_FOR_OBJECT;
|
||||
@@ -561,7 +561,7 @@ int Device_Encode_Property_APDU(uint8_t * apdu,
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
// error: internal error?
|
||||
/* error: internal error? */
|
||||
*error_class = ERROR_CLASS_SERVICES;
|
||||
*error_code = ERROR_CODE_OTHER;
|
||||
apdu_len = -1;
|
||||
@@ -609,21 +609,21 @@ int Device_Encode_Property_APDU(uint8_t * apdu,
|
||||
return apdu_len;
|
||||
}
|
||||
|
||||
// we can send an I-Am when our device ID changes
|
||||
/* we can send an I-Am when our device ID changes */
|
||||
extern bool I_Am_Request;
|
||||
|
||||
// returns true if successful
|
||||
/* returns true if successful */
|
||||
bool Device_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
|
||||
BACNET_ERROR_CLASS * error_class, BACNET_ERROR_CODE * error_code)
|
||||
{
|
||||
bool status = false; // return value
|
||||
bool status = false; /* return value */
|
||||
|
||||
if (!Device_Valid_Object_Instance_Number(wp_data->object_instance)) {
|
||||
*error_class = ERROR_CLASS_OBJECT;
|
||||
*error_code = ERROR_CODE_UNKNOWN_OBJECT;
|
||||
return false;
|
||||
}
|
||||
// decode the some of the request
|
||||
/* decode the some of the request */
|
||||
switch (wp_data->object_property) {
|
||||
case PROP_OBJECT_IDENTIFIER:
|
||||
if (wp_data->value.tag == BACNET_APPLICATION_TAG_OBJECT_ID) {
|
||||
@@ -765,7 +765,7 @@ void testDevice(Test * pTest)
|
||||
}
|
||||
|
||||
#ifdef TEST_DEVICE
|
||||
// stubs to dependencies to keep unit test simple
|
||||
/* stubs to dependencies to keep unit test simple */
|
||||
unsigned Analog_Input_Count(void)
|
||||
{
|
||||
return 0;
|
||||
|
||||
@@ -76,7 +76,7 @@ extern "C" {
|
||||
const char *Device_Location(void);
|
||||
bool Device_Set_Location(const char *name, size_t length);
|
||||
|
||||
// some stack-centric constant values - no set methods
|
||||
/* some stack-centric constant values - no set methods */
|
||||
uint8_t Device_Protocol_Version(void);
|
||||
uint8_t Device_Protocol_Revision(void);
|
||||
uint16_t Device_Max_APDU_Length_Accepted(void);
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
#include "handlers.h"
|
||||
#include "txbuf.h"
|
||||
|
||||
// buffer used for receive
|
||||
/* buffer used for receive */
|
||||
static uint8_t Rx_Buf[MAX_MPDU] = { 0 };
|
||||
|
||||
/* global variables used in this file */
|
||||
@@ -117,11 +117,11 @@ static uint8_t Send_Atomic_Read_File_Stream(uint32_t device_id,
|
||||
status = tsm_transaction_available();
|
||||
if (status) {
|
||||
datalink_get_my_address(&my_address);
|
||||
pdu_len = npdu_encode_apdu(&Handler_Transmit_Buffer[0], &dest, &my_address, true, // true for confirmed messages
|
||||
pdu_len = npdu_encode_apdu(&Handler_Transmit_Buffer[0], &dest, &my_address, true, /* true for confirmed messages */
|
||||
MESSAGE_PRIORITY_NORMAL);
|
||||
|
||||
invoke_id = tsm_next_free_invokeID();
|
||||
// load the data for the encoding
|
||||
/* load the data for the encoding */
|
||||
data.object_type = OBJECT_FILE;
|
||||
data.object_instance = file_instance;
|
||||
data.access = FILE_STREAM_ACCESS;
|
||||
@@ -137,8 +137,8 @@ static uint8_t Send_Atomic_Read_File_Stream(uint32_t device_id,
|
||||
if ((unsigned) pdu_len < max_apdu) {
|
||||
tsm_set_confirmed_unsegmented_transaction(invoke_id,
|
||||
&dest, &Handler_Transmit_Buffer[0], pdu_len);
|
||||
bytes_sent = datalink_send_pdu(&dest, // destination address
|
||||
&Handler_Transmit_Buffer[0], pdu_len); // number of bytes of data
|
||||
bytes_sent = datalink_send_pdu(&dest, /* destination address */
|
||||
&Handler_Transmit_Buffer[0], pdu_len); /* number of bytes of data */
|
||||
if (bytes_sent <= 0)
|
||||
fprintf(stderr,
|
||||
"Failed to Send AtomicReadFile Request (%s)!\n",
|
||||
@@ -161,7 +161,7 @@ static void Send_WhoIs(uint32_t device_id)
|
||||
datalink_get_broadcast_address(&dest);
|
||||
|
||||
/* encode the NPDU portion of the packet */
|
||||
pdu_len = npdu_encode_apdu(&Handler_Transmit_Buffer[0], &dest, NULL, false, // true for confirmed messages
|
||||
pdu_len = npdu_encode_apdu(&Handler_Transmit_Buffer[0], &dest, NULL, false, /* true for confirmed messages */
|
||||
MESSAGE_PRIORITY_NORMAL);
|
||||
|
||||
/* encode the APDU portion of the packet */
|
||||
@@ -268,9 +268,9 @@ static void Init_Service_Handlers(void)
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
BACNET_ADDRESS src = { 0 }; // address where message came from
|
||||
BACNET_ADDRESS src = { 0 }; /* address where message came from */
|
||||
uint16_t pdu_len = 0;
|
||||
unsigned timeout = 100; // milliseconds
|
||||
unsigned timeout = 100; /* milliseconds */
|
||||
unsigned max_apdu = 0;
|
||||
time_t elapsed_seconds = 0;
|
||||
time_t last_seconds = 0;
|
||||
|
||||
+12
-12
@@ -50,10 +50,10 @@ void dlmstp_cleanup(void)
|
||||
}
|
||||
|
||||
/* returns number of bytes sent on success, negative on failure */
|
||||
int dlmstp_send_pdu(BACNET_ADDRESS * dest, // destination address
|
||||
uint8_t * pdu, // any data to be sent - may be null
|
||||
unsigned pdu_len) // number of bytes of data
|
||||
{
|
||||
int dlmstp_send_pdu(BACNET_ADDRESS * dest, /* destination address */
|
||||
uint8_t * pdu, /* any data to be sent - may be null */
|
||||
unsigned pdu_len)
|
||||
{ /* number of bytes of data */
|
||||
|
||||
(void) dest;
|
||||
(void) pdu;
|
||||
@@ -62,12 +62,12 @@ int dlmstp_send_pdu(BACNET_ADDRESS * dest, // destination address
|
||||
return 0;
|
||||
}
|
||||
|
||||
// returns the number of octets in the PDU, or zero on failure
|
||||
uint16_t dlmstp_receive(BACNET_ADDRESS * src, // source address
|
||||
uint8_t * pdu, // PDU data
|
||||
uint16_t max_pdu, // amount of space available in the PDU
|
||||
unsigned timeout) // milliseconds to wait for a packet
|
||||
{
|
||||
/* returns the number of octets in the PDU, or zero on failure */
|
||||
uint16_t dlmstp_receive(BACNET_ADDRESS * src, /* source address */
|
||||
uint8_t * pdu, /* PDU data */
|
||||
uint16_t max_pdu, /* amount of space available in the PDU */
|
||||
unsigned timeout)
|
||||
{ /* milliseconds to wait for a packet */
|
||||
(void) src;
|
||||
(void) pdu;
|
||||
(void) max_pdu;
|
||||
@@ -86,7 +86,7 @@ void dlmstp_get_my_address(BACNET_ADDRESS * my_address)
|
||||
return;
|
||||
}
|
||||
|
||||
void dlmstp_get_broadcast_address(BACNET_ADDRESS * dest) // destination address
|
||||
{
|
||||
void dlmstp_get_broadcast_address(BACNET_ADDRESS * dest)
|
||||
{ /* destination address */
|
||||
return;
|
||||
}
|
||||
|
||||
+10
-10
@@ -40,7 +40,7 @@
|
||||
#include <stddef.h>
|
||||
#include "bacdef.h"
|
||||
|
||||
// defines specific to MS/TP
|
||||
/* defines specific to MS/TP */
|
||||
#define MAX_HEADER (2+1+1+1+2+1+2+1)
|
||||
#define MAX_MPDU (MAX_HEADER+MAX_PDU)
|
||||
|
||||
@@ -52,19 +52,19 @@ extern "C" {
|
||||
void dlmstp_cleanup(void);
|
||||
|
||||
/* returns number of bytes sent on success, negative on failure */
|
||||
int dlmstp_send_pdu(BACNET_ADDRESS * dest, // destination address
|
||||
uint8_t * pdu, // any data to be sent - may be null
|
||||
unsigned pdu_len); // number of bytes of data
|
||||
int dlmstp_send_pdu(BACNET_ADDRESS * dest, /* destination address */
|
||||
uint8_t * pdu, /* any data to be sent - may be null */
|
||||
unsigned pdu_len); /* number of bytes of data */
|
||||
|
||||
// returns the number of octets in the PDU, or zero on failure
|
||||
uint16_t dlmstp_receive(BACNET_ADDRESS * src, // source address
|
||||
uint8_t * pdu, // PDU data
|
||||
uint16_t max_pdu, // amount of space available in the PDU
|
||||
unsigned timeout); // milliseconds to wait for a packet
|
||||
/* returns the number of octets in the PDU, or zero on failure */
|
||||
uint16_t dlmstp_receive(BACNET_ADDRESS * src, /* source address */
|
||||
uint8_t * pdu, /* PDU data */
|
||||
uint16_t max_pdu, /* amount of space available in the PDU */
|
||||
unsigned timeout); /* milliseconds to wait for a packet */
|
||||
|
||||
void dlmstp_set_my_address(BACNET_ADDRESS * my_address);
|
||||
void dlmstp_get_my_address(BACNET_ADDRESS * my_address);
|
||||
void dlmstp_get_broadcast_address(BACNET_ADDRESS * dest); // destination address
|
||||
void dlmstp_get_broadcast_address(BACNET_ADDRESS * dest); /* destination address */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
+15
-15
@@ -39,7 +39,7 @@
|
||||
#include <stddef.h>
|
||||
#include "bacdef.h"
|
||||
|
||||
// specific defines for Ethernet
|
||||
/* specific defines for Ethernet */
|
||||
#define MAX_HEADER (6+6+2+1+1+1)
|
||||
#define MAX_MPDU (MAX_HEADER+MAX_PDU)
|
||||
|
||||
@@ -53,27 +53,27 @@ extern "C" {
|
||||
|
||||
/* function to send a packet out the 802.2 socket */
|
||||
/* returns number of bytes sent on success, negative on failure */
|
||||
int ethernet_send(BACNET_ADDRESS * dest, // destination address
|
||||
BACNET_ADDRESS * src, // source address
|
||||
uint8_t * pdu, // any data to be sent - may be null
|
||||
unsigned pdu_len); // number of bytes of data
|
||||
int ethernet_send(BACNET_ADDRESS * dest, /* destination address */
|
||||
BACNET_ADDRESS * src, /* source address */
|
||||
uint8_t * pdu, /* any data to be sent - may be null */
|
||||
unsigned pdu_len); /* number of bytes of data */
|
||||
|
||||
/* function to send a packet out the 802.2 socket */
|
||||
/* returns number of bytes sent on success, negative on failure */
|
||||
int ethernet_send_pdu(BACNET_ADDRESS * dest, // destination address
|
||||
uint8_t * pdu, // any data to be sent - may be null
|
||||
unsigned pdu_len); // number of bytes of data
|
||||
int ethernet_send_pdu(BACNET_ADDRESS * dest, /* destination address */
|
||||
uint8_t * pdu, /* any data to be sent - may be null */
|
||||
unsigned pdu_len); /* number of bytes of data */
|
||||
|
||||
// receives an 802.2 framed packet
|
||||
// returns the number of octets in the PDU, or zero on failure
|
||||
uint16_t ethernet_receive(BACNET_ADDRESS * src, // source address
|
||||
uint8_t * pdu, // PDU data
|
||||
uint16_t max_pdu, // amount of space available in the PDU
|
||||
unsigned timeout); // milliseconds to wait for a packet
|
||||
/* receives an 802.2 framed packet */
|
||||
/* returns the number of octets in the PDU, or zero on failure */
|
||||
uint16_t ethernet_receive(BACNET_ADDRESS * src, /* source address */
|
||||
uint8_t * pdu, /* PDU data */
|
||||
uint16_t max_pdu, /* amount of space available in the PDU */
|
||||
unsigned timeout); /* milliseconds to wait for a packet */
|
||||
|
||||
void ethernet_set_my_address(BACNET_ADDRESS * my_address);
|
||||
void ethernet_get_my_address(BACNET_ADDRESS * my_address);
|
||||
void ethernet_get_broadcast_address(BACNET_ADDRESS * dest); // destination address
|
||||
void ethernet_get_broadcast_address(BACNET_ADDRESS * dest); /* destination address */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
+28
-28
@@ -40,17 +40,17 @@
|
||||
#include "bacdcode.h"
|
||||
#include "address.h"
|
||||
|
||||
// encode I-Am service
|
||||
/* encode I-Am service */
|
||||
int iam_encode_apdu(uint8_t * apdu,
|
||||
uint32_t device_id,
|
||||
unsigned max_apdu, int segmentation, uint16_t vendor_id)
|
||||
{
|
||||
int len = 0; // length of each encoding
|
||||
int apdu_len = 0; // total length of the apdu, return value
|
||||
int len = 0; /* length of each encoding */
|
||||
int apdu_len = 0; /* total length of the apdu, return value */
|
||||
|
||||
if (apdu) {
|
||||
apdu[0] = PDU_TYPE_UNCONFIRMED_SERVICE_REQUEST;
|
||||
apdu[1] = SERVICE_UNCONFIRMED_I_AM; // service choice
|
||||
apdu[1] = SERVICE_UNCONFIRMED_I_AM; /* service choice */
|
||||
apdu_len = 2;
|
||||
len = encode_tagged_object_id(&apdu[apdu_len],
|
||||
OBJECT_DEVICE, device_id);
|
||||
@@ -71,15 +71,15 @@ int iam_decode_service_request(uint8_t * apdu,
|
||||
unsigned *pMax_apdu, int *pSegmentation, uint16_t * pVendor_id)
|
||||
{
|
||||
int len = 0;
|
||||
int apdu_len = 0; // total length of the apdu, return value
|
||||
int object_type = 0; // should be a Device Object
|
||||
int apdu_len = 0; /* total length of the apdu, return value */
|
||||
int object_type = 0; /* should be a Device Object */
|
||||
uint32_t object_instance = 0;
|
||||
uint8_t tag_number = 0;
|
||||
uint32_t len_value = 0;
|
||||
uint32_t decoded_value = 0;
|
||||
int decoded_integer = 0;
|
||||
|
||||
// OBJECT ID - object id
|
||||
/* OBJECT ID - object id */
|
||||
len =
|
||||
decode_tag_number_and_value(&apdu[apdu_len], &tag_number,
|
||||
&len_value);
|
||||
@@ -93,7 +93,7 @@ int iam_decode_service_request(uint8_t * apdu,
|
||||
return -1;
|
||||
if (pDevice_id)
|
||||
*pDevice_id = object_instance;
|
||||
// MAX APDU - unsigned
|
||||
/* MAX APDU - unsigned */
|
||||
len =
|
||||
decode_tag_number_and_value(&apdu[apdu_len], &tag_number,
|
||||
&len_value);
|
||||
@@ -104,7 +104,7 @@ int iam_decode_service_request(uint8_t * apdu,
|
||||
apdu_len += len;
|
||||
if (pMax_apdu)
|
||||
*pMax_apdu = decoded_value;
|
||||
// Segmentation - enumerated
|
||||
/* Segmentation - enumerated */
|
||||
len =
|
||||
decode_tag_number_and_value(&apdu[apdu_len], &tag_number,
|
||||
&len_value);
|
||||
@@ -117,7 +117,7 @@ int iam_decode_service_request(uint8_t * apdu,
|
||||
return -1;
|
||||
if (pSegmentation)
|
||||
*pSegmentation = decoded_integer;
|
||||
// Vendor ID - unsigned16
|
||||
/* Vendor ID - unsigned16 */
|
||||
len =
|
||||
decode_tag_number_and_value(&apdu[apdu_len], &tag_number,
|
||||
&len_value);
|
||||
@@ -138,12 +138,12 @@ int iam_decode_apdu(uint8_t * apdu,
|
||||
uint32_t * pDevice_id,
|
||||
unsigned *pMax_apdu, int *pSegmentation, uint16_t * pVendor_id)
|
||||
{
|
||||
int apdu_len = 0; // total length of the apdu, return value
|
||||
int apdu_len = 0; /* total length of the apdu, return value */
|
||||
|
||||
// valid data?
|
||||
/* valid data? */
|
||||
if (!apdu)
|
||||
return -1;
|
||||
// optional checking - most likely was already done prior to this call
|
||||
/* optional checking - most likely was already done prior to this call */
|
||||
if (apdu[0] != PDU_TYPE_UNCONFIRMED_SERVICE_REQUEST)
|
||||
return -1;
|
||||
if (apdu[1] != SERVICE_UNCONFIRMED_I_AM)
|
||||
@@ -160,20 +160,20 @@ int iam_send(uint8_t * buffer)
|
||||
BACNET_ADDRESS dest;
|
||||
int bytes_sent = 0;
|
||||
|
||||
// I-Am is a global broadcast
|
||||
/* I-Am is a global broadcast */
|
||||
datalink_get_broadcast_address(&dest);
|
||||
|
||||
// encode the NPDU portion of the packet
|
||||
pdu_len = npdu_encode_apdu(&buffer[0], &dest, NULL, false, // true for confirmed messages
|
||||
/* encode the NPDU portion of the packet */
|
||||
pdu_len = npdu_encode_apdu(&buffer[0], &dest, NULL, false, /* true for confirmed messages */
|
||||
MESSAGE_PRIORITY_NORMAL);
|
||||
|
||||
// encode the APDU portion of the packet
|
||||
/* encode the APDU portion of the packet */
|
||||
pdu_len += iam_encode_apdu(&buffer[pdu_len],
|
||||
Device_Object_Instance_Number(),
|
||||
MAX_APDU, SEGMENTATION_NONE, Device_Vendor_Identifier());
|
||||
|
||||
bytes_sent = datalink_send_pdu(&dest, // destination address
|
||||
&buffer[0], pdu_len); // number of bytes of data
|
||||
bytes_sent = datalink_send_pdu(&dest, /* destination address */
|
||||
&buffer[0], pdu_len); /* number of bytes of data */
|
||||
|
||||
return bytes_sent;
|
||||
}
|
||||
@@ -212,16 +212,16 @@ void testIAm(Test * pTest)
|
||||
}
|
||||
|
||||
#ifdef TEST_IAM
|
||||
// Dummy stubs to eliminate depencies
|
||||
void datalink_get_broadcast_address(BACNET_ADDRESS * dest) // destination address
|
||||
{
|
||||
/* Dummy stubs to eliminate depencies */
|
||||
void datalink_get_broadcast_address(BACNET_ADDRESS * dest)
|
||||
{ /* destination address */
|
||||
(void) dest;
|
||||
}
|
||||
|
||||
int datalink_send_pdu(BACNET_ADDRESS * dest, // destination address
|
||||
uint8_t * pdu, // any data to be sent - may be null
|
||||
unsigned pdu_len) // number of bytes of data
|
||||
{
|
||||
int datalink_send_pdu(BACNET_ADDRESS * dest, /* destination address */
|
||||
uint8_t * pdu, /* any data to be sent - may be null */
|
||||
unsigned pdu_len)
|
||||
{ /* number of bytes of data */
|
||||
(void) dest;
|
||||
(void) pdu;
|
||||
|
||||
@@ -246,10 +246,10 @@ void address_add_binding(uint32_t device_id,
|
||||
(void) src;
|
||||
}
|
||||
|
||||
// dummy for apdu dependency
|
||||
/* dummy for apdu dependency */
|
||||
void tsm_free_invoke_id(uint8_t invokeID)
|
||||
{
|
||||
// dummy stub for testing
|
||||
/* dummy stub for testing */
|
||||
(void) invokeID;
|
||||
}
|
||||
|
||||
|
||||
+6
-6
@@ -43,19 +43,19 @@
|
||||
|
||||
int main(void)
|
||||
{
|
||||
struct mstp_port_struct_t mstp_port; // port data
|
||||
uint8_t my_mac = 0x05; // local MAC address
|
||||
struct mstp_port_struct_t mstp_port; /* port data */
|
||||
uint8_t my_mac = 0x05; /* local MAC address */
|
||||
|
||||
MSTP_Init(&mstp_port, my_mac);
|
||||
|
||||
// loop forever
|
||||
/* loop forever */
|
||||
for (;;) {
|
||||
// input
|
||||
/* input */
|
||||
RS485_Check_UART_Data(&mstp_port);
|
||||
MSTP_Receive_Frame_FSM(&mstp_port);
|
||||
// process
|
||||
/* process */
|
||||
|
||||
// output
|
||||
/* output */
|
||||
MSTP_Master_Node_FSM(&mstp_port);
|
||||
|
||||
}
|
||||
|
||||
+427
-427
File diff suppressed because it is too large
Load Diff
+83
-83
@@ -42,12 +42,12 @@
|
||||
#include "bacdef.h"
|
||||
#include "dlmstp.h"
|
||||
|
||||
// The value 255 is used to denote broadcast when used as a
|
||||
// destination address but is not allowed as a value for a station.
|
||||
/* The value 255 is used to denote broadcast when used as a */
|
||||
/* destination address but is not allowed as a value for a station. */
|
||||
#define MSTP_BROADCAST_ADDRESS 255
|
||||
|
||||
// MS/TP Frame Type
|
||||
// Frame Types 8 through 127 are reserved by ASHRAE.
|
||||
/* MS/TP Frame Type */
|
||||
/* Frame Types 8 through 127 are reserved by ASHRAE. */
|
||||
#define FRAME_TYPE_TOKEN 0
|
||||
#define FRAME_TYPE_POLL_FOR_MASTER 1
|
||||
#define FRAME_TYPE_REPLY_TO_POLL_FOR_MASTER 2
|
||||
@@ -56,16 +56,16 @@
|
||||
#define FRAME_TYPE_BACNET_DATA_EXPECTING_REPLY 5
|
||||
#define FRAME_TYPE_BACNET_DATA_NOT_EXPECTING_REPLY 6
|
||||
#define FRAME_TYPE_REPLY_POSTPONED 7
|
||||
// Frame Types 128 through 255: Proprietary Frames
|
||||
// These frames are available to vendors as proprietary (non-BACnet) frames.
|
||||
// The first two octets of the Data field shall specify the unique vendor
|
||||
// identification code, most significant octet first, for the type of
|
||||
// vendor-proprietary frame to be conveyed. The length of the data portion
|
||||
// of a Proprietary frame shall be in the range of 2 to 501 octets.
|
||||
/* Frame Types 128 through 255: Proprietary Frames */
|
||||
/* These frames are available to vendors as proprietary (non-BACnet) frames. */
|
||||
/* The first two octets of the Data field shall specify the unique vendor */
|
||||
/* identification code, most significant octet first, for the type of */
|
||||
/* vendor-proprietary frame to be conveyed. The length of the data portion */
|
||||
/* of a Proprietary frame shall be in the range of 2 to 501 octets. */
|
||||
#define FRAME_TYPE_PROPRIETARY_MIN 128
|
||||
#define FRAME_TYPE_PROPRIETARY_MAX 255
|
||||
|
||||
// receive FSM states
|
||||
/* receive FSM states */
|
||||
typedef enum {
|
||||
MSTP_RECEIVE_STATE_IDLE,
|
||||
MSTP_RECEIVE_STATE_PREAMBLE,
|
||||
@@ -75,7 +75,7 @@ typedef enum {
|
||||
MSTP_RECEIVE_STATE_DATA_CRC
|
||||
} MSTP_RECEIVE_STATE;
|
||||
|
||||
// master node FSM states
|
||||
/* master node FSM states */
|
||||
typedef enum {
|
||||
MSTP_MASTER_STATE_INITIALIZE,
|
||||
MSTP_MASTER_STATE_IDLE,
|
||||
@@ -90,115 +90,115 @@ typedef enum {
|
||||
|
||||
struct mstp_port_struct_t {
|
||||
MSTP_RECEIVE_STATE receive_state;
|
||||
// When a master node is powered up or reset,
|
||||
// it shall unconditionally enter the INITIALIZE state.
|
||||
/* When a master node is powered up or reset, */
|
||||
/* it shall unconditionally enter the INITIALIZE state. */
|
||||
MSTP_MASTER_STATE master_state;
|
||||
// A Boolean flag set to TRUE by the Receive State Machine
|
||||
// if an error is detected during the reception of a frame.
|
||||
// Set to FALSE by the main state machine.
|
||||
/* A Boolean flag set to TRUE by the Receive State Machine */
|
||||
/* if an error is detected during the reception of a frame. */
|
||||
/* Set to FALSE by the main state machine. */
|
||||
unsigned ReceiveError:1;
|
||||
// There is data in the buffer
|
||||
/* There is data in the buffer */
|
||||
unsigned DataAvailable:1;
|
||||
unsigned FramingError:1; // TRUE if we got a framing error
|
||||
unsigned FramingError:1; /* TRUE if we got a framing error */
|
||||
unsigned ReceivedInvalidFrame:1;
|
||||
// A Boolean flag set to TRUE by the Receive State Machine
|
||||
// if a valid frame is received.
|
||||
// Set to FALSE by the main state machine.
|
||||
/* A Boolean flag set to TRUE by the Receive State Machine */
|
||||
/* if a valid frame is received. */
|
||||
/* Set to FALSE by the main state machine. */
|
||||
unsigned ReceivedValidFrame:1;
|
||||
// A Boolean flag set to TRUE by the master machine if this node is the
|
||||
// only known master node.
|
||||
/* A Boolean flag set to TRUE by the master machine if this node is the */
|
||||
/* only known master node. */
|
||||
unsigned SoleMaster:1;
|
||||
// After receiving a frame this value will be TRUE until Tturnaround
|
||||
// has expired
|
||||
/* After receiving a frame this value will be TRUE until Tturnaround */
|
||||
/* has expired */
|
||||
unsigned Turn_Around_Waiting:1;
|
||||
// stores the latest received data
|
||||
/* stores the latest received data */
|
||||
uint8_t DataRegister;
|
||||
// Used to accumulate the CRC on the data field of a frame.
|
||||
/* Used to accumulate the CRC on the data field of a frame. */
|
||||
uint16_t DataCRC;
|
||||
// Used to store the data length of a received frame.
|
||||
/* Used to store the data length of a received frame. */
|
||||
unsigned DataLength;
|
||||
// Used to store the destination address of a received frame.
|
||||
/* Used to store the destination address of a received frame. */
|
||||
uint8_t DestinationAddress;
|
||||
// Used to count the number of received octets or errors.
|
||||
// This is used in the detection of link activity.
|
||||
/* Used to count the number of received octets or errors. */
|
||||
/* This is used in the detection of link activity. */
|
||||
unsigned EventCount;
|
||||
// Used to store the frame type of a received frame.
|
||||
/* Used to store the frame type of a received frame. */
|
||||
uint8_t FrameType;
|
||||
// The number of frames sent by this node during a single token hold.
|
||||
// When this counter reaches the value Nmax_info_frames, the node must
|
||||
// pass the token.
|
||||
/* The number of frames sent by this node during a single token hold. */
|
||||
/* When this counter reaches the value Nmax_info_frames, the node must */
|
||||
/* pass the token. */
|
||||
unsigned FrameCount;
|
||||
// Used to accumulate the CRC on the header of a frame.
|
||||
/* Used to accumulate the CRC on the header of a frame. */
|
||||
uint8_t HeaderCRC;
|
||||
// Used as an index by the Receive State Machine, up to a maximum value of
|
||||
// InputBufferSize.
|
||||
/* Used as an index by the Receive State Machine, up to a maximum value of */
|
||||
/* InputBufferSize. */
|
||||
unsigned Index;
|
||||
// An array of octets, used to store octets as they are received.
|
||||
// InputBuffer is indexed from 0 to InputBufferSize-1.
|
||||
// The maximum size of a frame is 501 octets.
|
||||
/* An array of octets, used to store octets as they are received. */
|
||||
/* InputBuffer is indexed from 0 to InputBufferSize-1. */
|
||||
/* The maximum size of a frame is 501 octets. */
|
||||
uint8_t InputBuffer[MAX_MPDU];
|
||||
// "Next Station," the MAC address of the node to which This Station passes
|
||||
// the token. If the Next_Station is unknown, Next_Station shall be equal to
|
||||
// This_Station.
|
||||
/* "Next Station," the MAC address of the node to which This Station passes */
|
||||
/* the token. If the Next_Station is unknown, Next_Station shall be equal to */
|
||||
/* This_Station. */
|
||||
uint8_t Next_Station;
|
||||
// "Poll Station," the MAC address of the node to which This Station last
|
||||
// sent a Poll For Master. This is used during token maintenance.
|
||||
/* "Poll Station," the MAC address of the node to which This Station last */
|
||||
/* sent a Poll For Master. This is used during token maintenance. */
|
||||
uint8_t Poll_Station;
|
||||
// A counter of transmission retries used for Token and Poll For Master
|
||||
// transmission.
|
||||
/* A counter of transmission retries used for Token and Poll For Master */
|
||||
/* transmission. */
|
||||
unsigned RetryCount;
|
||||
// A timer with nominal 5 millisecond resolution used to measure and
|
||||
// generate silence on the medium between octets. It is incremented by a
|
||||
// timer process and is cleared by the Receive State Machine when activity
|
||||
// is detected and by the SendFrame procedure as each octet is transmitted.
|
||||
// Since the timer resolution is limited and the timer is not necessarily
|
||||
// synchronized to other machine events, a timer value of N will actually
|
||||
// denote intervals between N-1 and N
|
||||
/* A timer with nominal 5 millisecond resolution used to measure and */
|
||||
/* generate silence on the medium between octets. It is incremented by a */
|
||||
/* timer process and is cleared by the Receive State Machine when activity */
|
||||
/* is detected and by the SendFrame procedure as each octet is transmitted. */
|
||||
/* Since the timer resolution is limited and the timer is not necessarily */
|
||||
/* synchronized to other machine events, a timer value of N will actually */
|
||||
/* denote intervals between N-1 and N */
|
||||
unsigned SilenceTimer;
|
||||
|
||||
// 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
|
||||
// Machine when a Data Expecting Reply Answer activity is completed.
|
||||
/* 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 */
|
||||
/* Machine when a Data Expecting Reply Answer activity is completed. */
|
||||
unsigned ReplyPostponedTimer;
|
||||
|
||||
// Used to store the Source Address of a received frame.
|
||||
/* Used to store the Source Address of a received frame. */
|
||||
uint8_t SourceAddress;
|
||||
|
||||
// The number of tokens received by this node. When this counter reaches the
|
||||
// value Npoll, the node polls the address range between TS and NS for
|
||||
// additional master nodes. TokenCount is set to zero at the end of the
|
||||
// polling process.
|
||||
/* The number of tokens received by this node. When this counter reaches the */
|
||||
/* value Npoll, the node polls the address range between TS and NS for */
|
||||
/* additional master nodes. TokenCount is set to zero at the end of the */
|
||||
/* polling process. */
|
||||
unsigned TokenCount;
|
||||
|
||||
// "This Station," the MAC address of this node. TS is generally read from a
|
||||
// hardware DIP switch, or from nonvolatile memory. Valid values for TS are
|
||||
// 0 to 254. The value 255 is used to denote broadcast when used as a
|
||||
// destination address but is not allowed as a value for TS.
|
||||
/* "This Station," the MAC address of this node. TS is generally read from a */
|
||||
/* hardware DIP switch, or from nonvolatile memory. Valid values for TS are */
|
||||
/* 0 to 254. The value 255 is used to denote broadcast when used as a */
|
||||
/* destination address but is not allowed as a value for TS. */
|
||||
uint8_t This_Station;
|
||||
|
||||
// This parameter represents the value of the Max_Info_Frames property of
|
||||
// the node's Device object. The value of Max_Info_Frames specifies the
|
||||
// maximum number of information frames the node may send before it must
|
||||
// pass the token. Max_Info_Frames may have different values on different
|
||||
// nodes. This may be used to allocate more or less of the available link
|
||||
// bandwidth to particular nodes. If Max_Info_Frames is not writable in a
|
||||
// node, its value shall be 1.
|
||||
/* This parameter represents the value of the Max_Info_Frames property of */
|
||||
/* the node's Device object. The value of Max_Info_Frames specifies the */
|
||||
/* maximum number of information frames the node may send before it must */
|
||||
/* pass the token. Max_Info_Frames may have different values on different */
|
||||
/* nodes. This may be used to allocate more or less of the available link */
|
||||
/* bandwidth to particular nodes. If Max_Info_Frames is not writable in a */
|
||||
/* node, its value shall be 1. */
|
||||
unsigned Nmax_info_frames;
|
||||
|
||||
// This parameter represents the value of the Max_Master property of the
|
||||
// node's Device object. The value of Max_Master specifies the highest
|
||||
// allowable address for master nodes. The value of Max_Master shall be
|
||||
// less than or equal to 127. If Max_Master is not writable in a node,
|
||||
// its value shall be 127.
|
||||
/* This parameter represents the value of the Max_Master property of the */
|
||||
/* node's Device object. The value of Max_Master specifies the highest */
|
||||
/* allowable address for master nodes. The value of Max_Master shall be */
|
||||
/* less than or equal to 127. If Max_Master is not writable in a node, */
|
||||
/* its value shall be 127. */
|
||||
unsigned Nmax_master;
|
||||
};
|
||||
|
||||
#define DEFAULT_MAX_INFO_FRAMES 1
|
||||
#define DEFAULT_MAX_MASTER 127
|
||||
|
||||
// The minimum time after the end of the stop bit of the final octet of a
|
||||
// received frame before a node may enable its EIA-485 driver: 40 bit times.
|
||||
// At 9600 baud, 40 bit times would be about 4.166 milliseconds
|
||||
/* The minimum time after the end of the stop bit of the final octet of a */
|
||||
/* received frame before a node may enable its EIA-485 driver: 40 bit times. */
|
||||
/* At 9600 baud, 40 bit times would be about 4.166 milliseconds */
|
||||
#define Tturnaround 40;
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
+125
-125
@@ -44,58 +44,58 @@ int npdu_encode_raw(uint8_t * npdu,
|
||||
BACNET_ADDRESS * dest,
|
||||
BACNET_ADDRESS * src, BACNET_NPDU_DATA * npdu_data)
|
||||
{
|
||||
int len = 0; // return value - number of octets loaded in this function
|
||||
int i = 0; // counter
|
||||
int len = 0; /* return value - number of octets loaded in this function */
|
||||
int i = 0; /* counter */
|
||||
|
||||
if (npdu && npdu_data) {
|
||||
// Protocol Version
|
||||
/* Protocol Version */
|
||||
npdu[0] = 1;
|
||||
// control octet
|
||||
/* control octet */
|
||||
npdu[1] = 0;
|
||||
// Bit 7: 1 indicates that the NSDU conveys a network layer message.
|
||||
// Message Type field is present.
|
||||
// 0 indicates that the NSDU contains a BACnet APDU.
|
||||
// Message Type field is absent.
|
||||
/* Bit 7: 1 indicates that the NSDU conveys a network layer message. */
|
||||
/* Message Type field is present. */
|
||||
/* 0 indicates that the NSDU contains a BACnet APDU. */
|
||||
/* Message Type field is absent. */
|
||||
if (npdu_data->network_layer_message)
|
||||
npdu[1] |= BIT7;
|
||||
//Bit 6: Reserved. Shall be zero.
|
||||
//Bit 5: Destination specifier where:
|
||||
// 0 = DNET, DLEN, DADR, and Hop Count absent
|
||||
// 1 = DNET, DLEN, and Hop Count present
|
||||
// DLEN = 0 denotes broadcast MAC DADR and DADR field is absent
|
||||
// DLEN > 0 specifies length of DADR field
|
||||
/*Bit 6: Reserved. Shall be zero. */
|
||||
/*Bit 5: Destination specifier where: */
|
||||
/* 0 = DNET, DLEN, DADR, and Hop Count absent */
|
||||
/* 1 = DNET, DLEN, and Hop Count present */
|
||||
/* DLEN = 0 denotes broadcast MAC DADR and DADR field is absent */
|
||||
/* DLEN > 0 specifies length of DADR field */
|
||||
if (dest && dest->net)
|
||||
npdu[1] |= BIT5;
|
||||
// Bit 4: Reserved. Shall be zero.
|
||||
// Bit 3: Source specifier where:
|
||||
// 0 = SNET, SLEN, and SADR absent
|
||||
// 1 = SNET, SLEN, and SADR present
|
||||
// SLEN = 0 Invalid
|
||||
// SLEN > 0 specifies length of SADR field
|
||||
/* Bit 4: Reserved. Shall be zero. */
|
||||
/* Bit 3: Source specifier where: */
|
||||
/* 0 = SNET, SLEN, and SADR absent */
|
||||
/* 1 = SNET, SLEN, and SADR present */
|
||||
/* SLEN = 0 Invalid */
|
||||
/* SLEN > 0 specifies length of SADR field */
|
||||
if (src && src->net)
|
||||
npdu[1] |= BIT3;
|
||||
// Bit 2: The value of this bit corresponds to the data_expecting_reply
|
||||
// parameter in the N-UNITDATA primitives.
|
||||
// 1 indicates that a BACnet-Confirmed-Request-PDU,
|
||||
// a segment of a BACnet-ComplexACK-PDU,
|
||||
// or a network layer message expecting a reply is present.
|
||||
// 0 indicates that other than a BACnet-Confirmed-Request-PDU,
|
||||
// a segment of a BACnet-ComplexACK-PDU,
|
||||
// or a network layer message expecting a reply is present.
|
||||
/* Bit 2: The value of this bit corresponds to the data_expecting_reply */
|
||||
/* parameter in the N-UNITDATA primitives. */
|
||||
/* 1 indicates that a BACnet-Confirmed-Request-PDU, */
|
||||
/* a segment of a BACnet-ComplexACK-PDU, */
|
||||
/* or a network layer message expecting a reply is present. */
|
||||
/* 0 indicates that other than a BACnet-Confirmed-Request-PDU, */
|
||||
/* a segment of a BACnet-ComplexACK-PDU, */
|
||||
/* or a network layer message expecting a reply is present. */
|
||||
if (npdu_data->data_expecting_reply)
|
||||
npdu[1] |= BIT2;
|
||||
// Bits 1,0: Network priority where:
|
||||
// B'11' = Life Safety message
|
||||
// B'10' = Critical Equipment message
|
||||
// B'01' = Urgent message
|
||||
// B'00' = Normal message
|
||||
/* Bits 1,0: Network priority where: */
|
||||
/* B'11' = Life Safety message */
|
||||
/* B'10' = Critical Equipment message */
|
||||
/* B'01' = Urgent message */
|
||||
/* B'00' = Normal message */
|
||||
npdu[1] |= (npdu_data->priority & 0x03);
|
||||
len = 2;
|
||||
if (dest && dest->net) {
|
||||
len += encode_unsigned16(&npdu[len], dest->net);
|
||||
npdu[len++] = dest->len;
|
||||
// DLEN = 0 denotes broadcast MAC DADR and DADR field is absent
|
||||
// DLEN > 0 specifies length of DADR field
|
||||
/* DLEN = 0 denotes broadcast MAC DADR and DADR field is absent */
|
||||
/* DLEN > 0 specifies length of DADR field */
|
||||
if (dest->len) {
|
||||
for (i = 0; i < dest->len; i++) {
|
||||
npdu[len++] = dest->adr[i];
|
||||
@@ -105,17 +105,17 @@ int npdu_encode_raw(uint8_t * npdu,
|
||||
if (src && src->net) {
|
||||
len += encode_unsigned16(&npdu[len], src->net);
|
||||
npdu[len++] = src->len;
|
||||
// SLEN = 0 denotes broadcast MAC SADR and SADR field is absent
|
||||
// SLEN > 0 specifies length of SADR field
|
||||
/* SLEN = 0 denotes broadcast MAC SADR and SADR field is absent */
|
||||
/* SLEN > 0 specifies length of SADR field */
|
||||
if (src->len) {
|
||||
for (i = 0; i < src->len; i++) {
|
||||
npdu[len++] = src->adr[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
// The Hop Count field shall be present only if the message is
|
||||
// destined for a remote network, i.e., if DNET is present.
|
||||
// This is a one-octet field that is initialized to a value of 0xff.
|
||||
/* The Hop Count field shall be present only if the message is */
|
||||
/* destined for a remote network, i.e., if DNET is present. */
|
||||
/* This is a one-octet field that is initialized to a value of 0xff. */
|
||||
if (dest && dest->net) {
|
||||
npdu[len] = 0xFF;
|
||||
len++;
|
||||
@@ -123,8 +123,8 @@ int npdu_encode_raw(uint8_t * npdu,
|
||||
if (npdu_data->network_layer_message) {
|
||||
npdu[len] = npdu_data->network_message_type;
|
||||
len++;
|
||||
// Message Type field contains a value in the range 0x80 - 0xFF,
|
||||
// then a Vendor ID field shall be present
|
||||
/* Message Type field contains a value in the range 0x80 - 0xFF, */
|
||||
/* then a Vendor ID field shall be present */
|
||||
if (npdu_data->network_message_type >= 0x80)
|
||||
len += encode_unsigned16(&npdu[len], npdu_data->vendor_id);
|
||||
}
|
||||
@@ -133,19 +133,19 @@ int npdu_encode_raw(uint8_t * npdu,
|
||||
return len;
|
||||
}
|
||||
|
||||
// encode the NPDU portion of the packet for an APDU
|
||||
// This function does not handle the network messages, just APDUs.
|
||||
int npdu_encode_apdu(uint8_t * npdu, BACNET_ADDRESS * dest, BACNET_ADDRESS * src, bool data_expecting_reply, // true for confirmed messages
|
||||
/* encode the NPDU portion of the packet for an APDU */
|
||||
/* This function does not handle the network messages, just APDUs. */
|
||||
int npdu_encode_apdu(uint8_t * npdu, BACNET_ADDRESS * dest, BACNET_ADDRESS * src, bool data_expecting_reply, /* true for confirmed messages */
|
||||
BACNET_MESSAGE_PRIORITY priority)
|
||||
{
|
||||
BACNET_NPDU_DATA npdu_data = { 0 };
|
||||
|
||||
npdu_data.data_expecting_reply = data_expecting_reply;
|
||||
npdu_data.network_layer_message = false; // false if APDU
|
||||
npdu_data.network_message_type = 0; // optional
|
||||
npdu_data.vendor_id = 0; // optional, if net message type is > 0x80
|
||||
npdu_data.network_layer_message = false; /* false if APDU */
|
||||
npdu_data.network_message_type = 0; /* optional */
|
||||
npdu_data.vendor_id = 0; /* optional, if net message type is > 0x80 */
|
||||
npdu_data.priority = priority;
|
||||
// call the real function...
|
||||
/* call the real function... */
|
||||
return npdu_encode_raw(npdu, dest, src, &npdu_data);
|
||||
}
|
||||
|
||||
@@ -153,50 +153,50 @@ int npdu_decode(uint8_t * npdu,
|
||||
BACNET_ADDRESS * dest,
|
||||
BACNET_ADDRESS * src, BACNET_NPDU_DATA * npdu_data)
|
||||
{
|
||||
int len = 0; // return value - number of octets loaded in this function
|
||||
int i = 0; // counter
|
||||
int len = 0; /* return value - number of octets loaded in this function */
|
||||
int i = 0; /* counter */
|
||||
uint16_t src_net = 0;
|
||||
uint16_t dest_net = 0;
|
||||
uint8_t address_len = 0;
|
||||
uint8_t mac_octet = 0;
|
||||
|
||||
if (npdu && npdu_data) {
|
||||
// Protocol Version
|
||||
/* Protocol Version */
|
||||
npdu_data->protocol_version = npdu[0];
|
||||
// control octet
|
||||
// Bit 7: 1 indicates that the NSDU conveys a network layer message.
|
||||
// Message Type field is present.
|
||||
// 0 indicates that the NSDU contains a BACnet APDU.
|
||||
// Message Type field is absent.
|
||||
/* control octet */
|
||||
/* Bit 7: 1 indicates that the NSDU conveys a network layer message. */
|
||||
/* Message Type field is present. */
|
||||
/* 0 indicates that the NSDU contains a BACnet APDU. */
|
||||
/* Message Type field is absent. */
|
||||
npdu_data->network_layer_message = (npdu[1] & BIT7) ? true : false;
|
||||
//Bit 6: Reserved. Shall be zero.
|
||||
// Bit 4: Reserved. Shall be zero.
|
||||
// Bit 2: The value of this bit corresponds to the data_expecting_reply
|
||||
// parameter in the N-UNITDATA primitives.
|
||||
// 1 indicates that a BACnet-Confirmed-Request-PDU,
|
||||
// a segment of a BACnet-ComplexACK-PDU,
|
||||
// or a network layer message expecting a reply is present.
|
||||
// 0 indicates that other than a BACnet-Confirmed-Request-PDU,
|
||||
// a segment of a BACnet-ComplexACK-PDU,
|
||||
// or a network layer message expecting a reply is present.
|
||||
/*Bit 6: Reserved. Shall be zero. */
|
||||
/* Bit 4: Reserved. Shall be zero. */
|
||||
/* Bit 2: The value of this bit corresponds to the data_expecting_reply */
|
||||
/* parameter in the N-UNITDATA primitives. */
|
||||
/* 1 indicates that a BACnet-Confirmed-Request-PDU, */
|
||||
/* a segment of a BACnet-ComplexACK-PDU, */
|
||||
/* or a network layer message expecting a reply is present. */
|
||||
/* 0 indicates that other than a BACnet-Confirmed-Request-PDU, */
|
||||
/* a segment of a BACnet-ComplexACK-PDU, */
|
||||
/* or a network layer message expecting a reply is present. */
|
||||
npdu_data->data_expecting_reply = (npdu[1] & BIT2) ? true : false;
|
||||
// Bits 1,0: Network priority where:
|
||||
// B'11' = Life Safety message
|
||||
// B'10' = Critical Equipment message
|
||||
// B'01' = Urgent message
|
||||
// B'00' = Normal message
|
||||
/* Bits 1,0: Network priority where: */
|
||||
/* B'11' = Life Safety message */
|
||||
/* B'10' = Critical Equipment message */
|
||||
/* B'01' = Urgent message */
|
||||
/* B'00' = Normal message */
|
||||
npdu_data->priority = npdu[1] & 0x03;
|
||||
// set the offset to where the optional stuff starts
|
||||
/* set the offset to where the optional stuff starts */
|
||||
len = 2;
|
||||
//Bit 5: Destination specifier where:
|
||||
// 0 = DNET, DLEN, DADR, and Hop Count absent
|
||||
// 1 = DNET, DLEN, and Hop Count present
|
||||
// DLEN = 0 denotes broadcast MAC DADR and DADR field is absent
|
||||
// DLEN > 0 specifies length of DADR field
|
||||
/*Bit 5: Destination specifier where: */
|
||||
/* 0 = DNET, DLEN, DADR, and Hop Count absent */
|
||||
/* 1 = DNET, DLEN, and Hop Count present */
|
||||
/* DLEN = 0 denotes broadcast MAC DADR and DADR field is absent */
|
||||
/* DLEN > 0 specifies length of DADR field */
|
||||
if (npdu[1] & BIT5) {
|
||||
len += decode_unsigned16(&npdu[len], &dest_net);
|
||||
// DLEN = 0 denotes broadcast MAC DADR and DADR field is absent
|
||||
// DLEN > 0 specifies length of DADR field
|
||||
/* DLEN = 0 denotes broadcast MAC DADR and DADR field is absent */
|
||||
/* DLEN > 0 specifies length of DADR field */
|
||||
address_len = npdu[len++];
|
||||
if (dest) {
|
||||
dest->net = dest_net;
|
||||
@@ -210,7 +210,7 @@ int npdu_decode(uint8_t * npdu,
|
||||
}
|
||||
}
|
||||
}
|
||||
// zero out the destination address
|
||||
/* zero out the destination address */
|
||||
else if (dest) {
|
||||
dest->net = 0;
|
||||
dest->len = 0;
|
||||
@@ -218,15 +218,15 @@ int npdu_decode(uint8_t * npdu,
|
||||
dest->adr[i] = 0;
|
||||
}
|
||||
}
|
||||
// Bit 3: Source specifier where:
|
||||
// 0 = SNET, SLEN, and SADR absent
|
||||
// 1 = SNET, SLEN, and SADR present
|
||||
// SLEN = 0 Invalid
|
||||
// SLEN > 0 specifies length of SADR field
|
||||
/* Bit 3: Source specifier where: */
|
||||
/* 0 = SNET, SLEN, and SADR absent */
|
||||
/* 1 = SNET, SLEN, and SADR present */
|
||||
/* SLEN = 0 Invalid */
|
||||
/* SLEN > 0 specifies length of SADR field */
|
||||
if (npdu[1] & BIT3) {
|
||||
len += decode_unsigned16(&npdu[len], &src_net);
|
||||
// SLEN = 0 denotes broadcast MAC SADR and SADR field is absent
|
||||
// SLEN > 0 specifies length of SADR field
|
||||
/* SLEN = 0 denotes broadcast MAC SADR and SADR field is absent */
|
||||
/* SLEN > 0 specifies length of SADR field */
|
||||
address_len = npdu[len++];
|
||||
if (src) {
|
||||
src->net = src_net;
|
||||
@@ -246,19 +246,19 @@ int npdu_decode(uint8_t * npdu,
|
||||
src->adr[i] = 0;
|
||||
}
|
||||
}
|
||||
// The Hop Count field shall be present only if the message is
|
||||
// destined for a remote network, i.e., if DNET is present.
|
||||
// This is a one-octet field that is initialized to a value of 0xff.
|
||||
/* The Hop Count field shall be present only if the message is */
|
||||
/* destined for a remote network, i.e., if DNET is present. */
|
||||
/* This is a one-octet field that is initialized to a value of 0xff. */
|
||||
if (dest_net)
|
||||
npdu_data->hop_count = npdu[len++];
|
||||
else
|
||||
npdu_data->hop_count = 0;
|
||||
// Indicates that the NSDU conveys a network layer message.
|
||||
// Message Type field is present.
|
||||
/* Indicates that the NSDU conveys a network layer message. */
|
||||
/* Message Type field is present. */
|
||||
if (npdu_data->network_layer_message) {
|
||||
npdu_data->network_message_type = npdu[len++];
|
||||
// Message Type field contains a value in the range 0x80 - 0xFF,
|
||||
// then a Vendor ID field shall be present
|
||||
/* Message Type field contains a value in the range 0x80 - 0xFF, */
|
||||
/* then a Vendor ID field shall be present */
|
||||
if (npdu_data->network_message_type >= 0x80)
|
||||
len +=
|
||||
decode_unsigned16(&npdu[len], &npdu_data->vendor_id);
|
||||
@@ -269,20 +269,20 @@ int npdu_decode(uint8_t * npdu,
|
||||
return len;
|
||||
}
|
||||
|
||||
void npdu_handler(BACNET_ADDRESS * src, // source address
|
||||
uint8_t * pdu, // PDU data
|
||||
uint16_t pdu_len) // length PDU
|
||||
{
|
||||
void npdu_handler(BACNET_ADDRESS * src, /* source address */
|
||||
uint8_t * pdu, /* PDU data */
|
||||
uint16_t pdu_len)
|
||||
{ /* length PDU */
|
||||
int apdu_offset = 0;
|
||||
BACNET_ADDRESS dest = { 0 };
|
||||
BACNET_NPDU_DATA npdu_data = { 0 };
|
||||
|
||||
apdu_offset = npdu_decode(&pdu[0], // data to decode
|
||||
&dest, // destination address - get the DNET/DLEN/DADR if in there
|
||||
src, // source address - get the SNET/SLEN/SADR if in there
|
||||
&npdu_data); // amount of data to decode
|
||||
apdu_offset = npdu_decode(&pdu[0], /* data to decode */
|
||||
&dest, /* destination address - get the DNET/DLEN/DADR if in there */
|
||||
src, /* source address - get the SNET/SLEN/SADR if in there */
|
||||
&npdu_data); /* amount of data to decode */
|
||||
if (npdu_data.network_layer_message) {
|
||||
//FIXME: network layer message received! Handle it!
|
||||
/*FIXME: network layer message received! Handle it! */
|
||||
} else {
|
||||
apdu_handler(src,
|
||||
npdu_data.data_expecting_reply,
|
||||
@@ -306,21 +306,21 @@ void testNPDU2(Test * pTest)
|
||||
BACNET_ADDRESS npdu_dest = { 0 };
|
||||
BACNET_ADDRESS npdu_src = { 0 };
|
||||
int len = 0;
|
||||
bool data_expecting_reply = false; // true for confirmed messages
|
||||
bool data_expecting_reply = false; /* true for confirmed messages */
|
||||
BACNET_MESSAGE_PRIORITY priority = MESSAGE_PRIORITY_NORMAL;
|
||||
BACNET_NPDU_DATA npdu_data = { 0 };
|
||||
int i = 0; // counter
|
||||
int i = 0; /* counter */
|
||||
int npdu_len = 0;
|
||||
bool network_layer_message = false; // false if APDU
|
||||
BACNET_NETWORK_MESSAGE_TYPE network_message_type = 0; // optional
|
||||
uint16_t vendor_id = 0; // optional, if net message type is > 0x80
|
||||
bool network_layer_message = false; /* false if APDU */
|
||||
BACNET_NETWORK_MESSAGE_TYPE network_message_type = 0; /* optional */
|
||||
uint16_t vendor_id = 0; /* optional, if net message type is > 0x80 */
|
||||
|
||||
// mac_len = 0 if global address
|
||||
/* mac_len = 0 if global address */
|
||||
dest.mac_len = 6;
|
||||
for (i = 0; i < dest.mac_len; i++) {
|
||||
dest.mac[i] = i;
|
||||
}
|
||||
// DNET,DLEN,DADR
|
||||
/* DNET,DLEN,DADR */
|
||||
dest.net = 1;
|
||||
dest.len = 6;
|
||||
for (i = 0; i < dest.len; i++) {
|
||||
@@ -330,7 +330,7 @@ void testNPDU2(Test * pTest)
|
||||
for (i = 0; i < src.mac_len; i++) {
|
||||
src.mac[i] = 0x80;
|
||||
}
|
||||
// SNET,SLEN,SADR
|
||||
/* SNET,SLEN,SADR */
|
||||
src.net = 2;
|
||||
src.len = 1;
|
||||
for (i = 0; i < src.len; i++) {
|
||||
@@ -339,7 +339,7 @@ void testNPDU2(Test * pTest)
|
||||
len = npdu_encode_apdu(&pdu[0],
|
||||
&dest, &src, data_expecting_reply, priority);
|
||||
ct_test(pTest, len != 0);
|
||||
// can we get the info back?
|
||||
/* can we get the info back? */
|
||||
npdu_len = npdu_decode(&pdu[0], &npdu_dest, &npdu_src, &npdu_data);
|
||||
ct_test(pTest, npdu_len != 0);
|
||||
ct_test(pTest, npdu_data.data_expecting_reply == data_expecting_reply);
|
||||
@@ -348,13 +348,13 @@ void testNPDU2(Test * pTest)
|
||||
ct_test(pTest, npdu_data.network_message_type == network_message_type);
|
||||
ct_test(pTest, npdu_data.vendor_id == vendor_id);
|
||||
ct_test(pTest, npdu_data.priority == priority);
|
||||
// DNET,DLEN,DADR
|
||||
/* DNET,DLEN,DADR */
|
||||
ct_test(pTest, npdu_dest.net == dest.net);
|
||||
ct_test(pTest, npdu_dest.len == dest.len);
|
||||
for (i = 0; i < dest.len; i++) {
|
||||
ct_test(pTest, npdu_dest.adr[i] == dest.adr[i]);
|
||||
}
|
||||
// SNET,SLEN,SADR
|
||||
/* SNET,SLEN,SADR */
|
||||
ct_test(pTest, npdu_src.net == src.net);
|
||||
ct_test(pTest, npdu_src.len == src.len);
|
||||
for (i = 0; i < src.len; i++) {
|
||||
@@ -370,21 +370,21 @@ void testNPDU1(Test * pTest)
|
||||
BACNET_ADDRESS npdu_dest = { 0 };
|
||||
BACNET_ADDRESS npdu_src = { 0 };
|
||||
int len = 0;
|
||||
bool data_expecting_reply = false; // true for confirmed messages
|
||||
bool data_expecting_reply = false; /* true for confirmed messages */
|
||||
BACNET_MESSAGE_PRIORITY priority = MESSAGE_PRIORITY_NORMAL;
|
||||
BACNET_NPDU_DATA npdu_data = { 0 };
|
||||
int i = 0; // counter
|
||||
int i = 0; /* counter */
|
||||
int npdu_len = 0;
|
||||
bool network_layer_message = false; // false if APDU
|
||||
BACNET_NETWORK_MESSAGE_TYPE network_message_type = 0; // optional
|
||||
uint16_t vendor_id = 0; // optional, if net message type is > 0x80
|
||||
bool network_layer_message = false; /* false if APDU */
|
||||
BACNET_NETWORK_MESSAGE_TYPE network_message_type = 0; /* optional */
|
||||
uint16_t vendor_id = 0; /* optional, if net message type is > 0x80 */
|
||||
|
||||
// mac_len = 0 if global address
|
||||
/* mac_len = 0 if global address */
|
||||
dest.mac_len = 0;
|
||||
for (i = 0; i < MAX_MAC_LEN; i++) {
|
||||
dest.mac[i] = 0;
|
||||
}
|
||||
// DNET,DLEN,DADR
|
||||
/* DNET,DLEN,DADR */
|
||||
dest.net = 0;
|
||||
dest.len = 0;
|
||||
for (i = 0; i < MAX_MAC_LEN; i++) {
|
||||
@@ -394,7 +394,7 @@ void testNPDU1(Test * pTest)
|
||||
for (i = 0; i < MAX_MAC_LEN; i++) {
|
||||
src.mac[i] = 0;
|
||||
}
|
||||
// SNET,SLEN,SADR
|
||||
/* SNET,SLEN,SADR */
|
||||
src.net = 0;
|
||||
src.len = 0;
|
||||
for (i = 0; i < MAX_MAC_LEN; i++) {
|
||||
@@ -403,7 +403,7 @@ void testNPDU1(Test * pTest)
|
||||
len = npdu_encode_apdu(&pdu[0],
|
||||
&dest, &src, data_expecting_reply, priority);
|
||||
ct_test(pTest, len != 0);
|
||||
// can we get the info back?
|
||||
/* can we get the info back? */
|
||||
npdu_len = npdu_decode(&pdu[0], &npdu_dest, &npdu_src, &npdu_data);
|
||||
ct_test(pTest, npdu_len != 0);
|
||||
ct_test(pTest, npdu_data.data_expecting_reply == data_expecting_reply);
|
||||
@@ -417,7 +417,7 @@ void testNPDU1(Test * pTest)
|
||||
}
|
||||
|
||||
#ifdef TEST_NPDU
|
||||
// dummy stub for testing
|
||||
/* dummy stub for testing */
|
||||
void tsm_free_invoke_id(uint8_t invokeID)
|
||||
{
|
||||
(void) invokeID;
|
||||
|
||||
+12
-12
@@ -39,16 +39,16 @@
|
||||
#include "bacdef.h"
|
||||
#include "bacenum.h"
|
||||
|
||||
// an NPDU structure keeps the parameter stack to a minimum
|
||||
/* an NPDU structure keeps the parameter stack to a minimum */
|
||||
typedef struct bacnet_npdu_data_t {
|
||||
uint8_t protocol_version;
|
||||
// parts of the control octet:
|
||||
bool data_expecting_reply; // true for confirmed messages
|
||||
bool network_layer_message; // false if APDU
|
||||
/* parts of the control octet: */
|
||||
bool data_expecting_reply; /* true for confirmed messages */
|
||||
bool network_layer_message; /* false if APDU */
|
||||
BACNET_MESSAGE_PRIORITY priority;
|
||||
// optional network message info
|
||||
BACNET_NETWORK_MESSAGE_TYPE network_message_type; // optional
|
||||
uint16_t vendor_id; // optional, if net message type is > 0x80
|
||||
/* optional network message info */
|
||||
BACNET_NETWORK_MESSAGE_TYPE network_message_type; /* optional */
|
||||
uint16_t vendor_id; /* optional, if net message type is > 0x80 */
|
||||
uint8_t hop_count;
|
||||
} BACNET_NPDU_DATA;
|
||||
|
||||
@@ -60,17 +60,17 @@ extern "C" {
|
||||
int npdu_encode_raw(uint8_t * npdu,
|
||||
BACNET_ADDRESS * dest,
|
||||
BACNET_ADDRESS * src, BACNET_NPDU_DATA * npdu_data);
|
||||
// encode the NPDU portion of the packet for an APDU
|
||||
int npdu_encode_apdu(uint8_t * npdu, BACNET_ADDRESS * dest, BACNET_ADDRESS * src, bool data_expecting_reply, // true for confirmed messages
|
||||
/* encode the NPDU portion of the packet for an APDU */
|
||||
int npdu_encode_apdu(uint8_t * npdu, BACNET_ADDRESS * dest, BACNET_ADDRESS * src, bool data_expecting_reply, /* true for confirmed messages */
|
||||
BACNET_MESSAGE_PRIORITY priority);
|
||||
|
||||
int npdu_decode(uint8_t * npdu,
|
||||
BACNET_ADDRESS * dest,
|
||||
BACNET_ADDRESS * src, BACNET_NPDU_DATA * npdu_data);
|
||||
|
||||
void npdu_handler(BACNET_ADDRESS * src, // source address
|
||||
uint8_t * pdu, // PDU data
|
||||
uint16_t pdu_len); // length PDU
|
||||
void npdu_handler(BACNET_ADDRESS * src, /* source address */
|
||||
uint8_t * pdu, /* PDU data */
|
||||
uint16_t pdu_len); /* length PDU */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
+2
-2
@@ -110,10 +110,10 @@ int rd_decode_apdu(uint8_t * apdu,
|
||||
|
||||
if (!apdu)
|
||||
return -1;
|
||||
// optional checking - most likely was already done prior to this call
|
||||
/* optional checking - most likely was already done prior to this call */
|
||||
if (apdu[0] != PDU_TYPE_CONFIRMED_SERVICE_REQUEST)
|
||||
return -1;
|
||||
// apdu[1] = encode_max_segs_max_apdu(0, Device_Max_APDU_Length_Accepted());
|
||||
/* apdu[1] = encode_max_segs_max_apdu(0, Device_Max_APDU_Length_Accepted()); */
|
||||
*invoke_id = apdu[2]; /* invoke id - filled in by net layer */
|
||||
if (apdu[3] != SERVICE_CONFIRMED_REINITIALIZE_DEVICE)
|
||||
return -1;
|
||||
|
||||
+2
-2
@@ -41,13 +41,13 @@
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
// encode service
|
||||
/* encode service */
|
||||
int rd_encode_apdu(uint8_t * apdu,
|
||||
uint8_t invoke_id,
|
||||
BACNET_REINITIALIZED_STATE state,
|
||||
BACNET_CHARACTER_STRING * password);
|
||||
|
||||
// decode the service request only
|
||||
/* decode the service request only */
|
||||
int rd_decode_service_request(uint8_t * apdu,
|
||||
unsigned apdu_len,
|
||||
BACNET_REINITIALIZED_STATE * state,
|
||||
|
||||
@@ -36,11 +36,11 @@
|
||||
#include "bacdcode.h"
|
||||
#include "bacdef.h"
|
||||
|
||||
// encode service
|
||||
/* encode service */
|
||||
int reject_encode_apdu(uint8_t * apdu,
|
||||
uint8_t invoke_id, uint8_t reject_reason)
|
||||
{
|
||||
int apdu_len = 0; // total length of the apdu, return value
|
||||
int apdu_len = 0; /* total length of the apdu, return value */
|
||||
|
||||
if (apdu) {
|
||||
apdu[0] = PDU_TYPE_REJECT;
|
||||
@@ -52,7 +52,7 @@ int reject_encode_apdu(uint8_t * apdu,
|
||||
return apdu_len;
|
||||
}
|
||||
|
||||
// decode the service request only
|
||||
/* decode the service request only */
|
||||
int reject_decode_service_request(uint8_t * apdu,
|
||||
unsigned apdu_len, uint8_t * invoke_id, uint8_t * reject_reason)
|
||||
{
|
||||
@@ -68,7 +68,7 @@ int reject_decode_service_request(uint8_t * apdu,
|
||||
return len;
|
||||
}
|
||||
|
||||
// decode the whole APDU - mainly used for unit testing
|
||||
/* decode the whole APDU - mainly used for unit testing */
|
||||
int reject_decode_apdu(uint8_t * apdu,
|
||||
unsigned apdu_len, uint8_t * invoke_id, uint8_t * reject_reason)
|
||||
{
|
||||
@@ -76,7 +76,7 @@ int reject_decode_apdu(uint8_t * apdu,
|
||||
|
||||
if (!apdu)
|
||||
return -1;
|
||||
// optional checking - most likely was already done prior to this call
|
||||
/* optional checking - most likely was already done prior to this call */
|
||||
if (apdu_len) {
|
||||
if (apdu[0] != PDU_TYPE_REJECT)
|
||||
return -1;
|
||||
@@ -114,24 +114,24 @@ void testReject(Test * pTest)
|
||||
ct_test(pTest, test_invoke_id == invoke_id);
|
||||
ct_test(pTest, test_reject_reason == reject_reason);
|
||||
|
||||
// change type to get negative response
|
||||
/* change type to get negative response */
|
||||
apdu[0] = PDU_TYPE_ABORT;
|
||||
len = reject_decode_apdu(&apdu[0],
|
||||
apdu_len, &test_invoke_id, &test_reject_reason);
|
||||
ct_test(pTest, len == -1);
|
||||
|
||||
// test NULL APDU
|
||||
/* test NULL APDU */
|
||||
len = reject_decode_apdu(NULL,
|
||||
apdu_len, &test_invoke_id, &test_reject_reason);
|
||||
ct_test(pTest, len == -1);
|
||||
|
||||
// force a zero length
|
||||
/* force a zero length */
|
||||
len = reject_decode_apdu(&apdu[0],
|
||||
0, &test_invoke_id, &test_reject_reason);
|
||||
ct_test(pTest, len == 0);
|
||||
|
||||
|
||||
// check them all...
|
||||
/* check them all... */
|
||||
for (invoke_id = 0; invoke_id < 255; invoke_id++) {
|
||||
for (reject_reason = 0; reject_reason < 255; reject_reason++) {
|
||||
len = reject_encode_apdu(&apdu[0], invoke_id, reject_reason);
|
||||
|
||||
+19
-19
@@ -70,7 +70,7 @@ char *Ringbuf_Get_Front(RING_BUFFER const *b)
|
||||
*****************************************************************************/
|
||||
char *Ringbuf_Pop_Front(RING_BUFFER * b)
|
||||
{
|
||||
char *data = NULL; // return value
|
||||
char *data = NULL; /* return value */
|
||||
|
||||
if (b->count) {
|
||||
data = &(b->data[b->head * b->element_size]);
|
||||
@@ -89,16 +89,16 @@ char *Ringbuf_Pop_Front(RING_BUFFER * b)
|
||||
* ALGORITHM: none
|
||||
* NOTES: none
|
||||
*****************************************************************************/
|
||||
bool Ringbuf_Put(RING_BUFFER * b, // ring buffer structure
|
||||
char *data_element) // one element to add to the ring
|
||||
{
|
||||
bool status = false; // return value
|
||||
unsigned offset = 0; // offset into array of data
|
||||
char *ring_data = NULL; // used to help point ring data
|
||||
unsigned i; // loop counter
|
||||
bool Ringbuf_Put(RING_BUFFER * b, /* ring buffer structure */
|
||||
char *data_element)
|
||||
{ /* one element to add to the ring */
|
||||
bool status = false; /* return value */
|
||||
unsigned offset = 0; /* offset into array of data */
|
||||
char *ring_data = NULL; /* used to help point ring data */
|
||||
unsigned i; /* loop counter */
|
||||
|
||||
if (b && data_element) {
|
||||
// limit the amount of data that we accept
|
||||
/* limit the amount of data that we accept */
|
||||
if (b->count < b->element_count) {
|
||||
offset = b->head + b->count;
|
||||
if (offset >= b->element_count)
|
||||
@@ -121,11 +121,11 @@ bool Ringbuf_Put(RING_BUFFER * b, // ring buffer structure
|
||||
* ALGORITHM: none
|
||||
* NOTES: none
|
||||
*****************************************************************************/
|
||||
void Ringbuf_Init(RING_BUFFER * b, // ring buffer structure
|
||||
char *data, // data block or array of data
|
||||
unsigned element_size, // size of one element in the data block
|
||||
unsigned element_count) // number of elements in the data block
|
||||
{
|
||||
void Ringbuf_Init(RING_BUFFER * b, /* ring buffer structure */
|
||||
char *data, /* data block or array of data */
|
||||
unsigned element_size, /* size of one element in the data block */
|
||||
unsigned element_count)
|
||||
{ /* number of elements in the data block */
|
||||
b->head = 0;
|
||||
b->count = 0;
|
||||
b->data = data;
|
||||
@@ -141,7 +141,7 @@ void Ringbuf_Init(RING_BUFFER * b, // ring buffer structure
|
||||
|
||||
#include "ctest.h"
|
||||
|
||||
// test the FIFO
|
||||
/* test the FIFO */
|
||||
#define RING_BUFFER_DATA_SIZE 5
|
||||
#define RING_BUFFER_SIZE 16
|
||||
void testRingBuf(Test * pTest)
|
||||
@@ -179,7 +179,7 @@ void testRingBuf(Test * pTest)
|
||||
}
|
||||
ct_test(pTest, Ringbuf_Empty(&test_buffer));
|
||||
|
||||
// fill to max
|
||||
/* fill to max */
|
||||
for (index = 0; index < RING_BUFFER_SIZE; index++) {
|
||||
for (data_index = 0; data_index < RING_BUFFER_DATA_SIZE;
|
||||
data_index++) {
|
||||
@@ -189,7 +189,7 @@ void testRingBuf(Test * pTest)
|
||||
ct_test(pTest, status == true);
|
||||
ct_test(pTest, !Ringbuf_Empty(&test_buffer));
|
||||
}
|
||||
// verify actions on full buffer
|
||||
/* verify actions on full buffer */
|
||||
for (index = 0; index < RING_BUFFER_SIZE; index++) {
|
||||
for (data_index = 0; data_index < RING_BUFFER_DATA_SIZE;
|
||||
data_index++) {
|
||||
@@ -200,7 +200,7 @@ void testRingBuf(Test * pTest)
|
||||
ct_test(pTest, !Ringbuf_Empty(&test_buffer));
|
||||
}
|
||||
|
||||
// check buffer full
|
||||
/* check buffer full */
|
||||
for (index = 0; index < RING_BUFFER_SIZE; index++) {
|
||||
test_data = Ringbuf_Get_Front(&test_buffer);
|
||||
for (data_index = 0; data_index < RING_BUFFER_DATA_SIZE;
|
||||
@@ -216,7 +216,7 @@ void testRingBuf(Test * pTest)
|
||||
}
|
||||
ct_test(pTest, Ringbuf_Empty(&test_buffer));
|
||||
|
||||
// test the ring around the buffer
|
||||
/* test the ring around the buffer */
|
||||
for (index = 0; index < RING_BUFFER_SIZE; index++) {
|
||||
for (count = 1; count < 4; count++) {
|
||||
dummy = index * count;
|
||||
|
||||
+11
-11
@@ -43,11 +43,11 @@
|
||||
#include <stdbool.h>
|
||||
|
||||
struct ring_buffer_t {
|
||||
char *data; // block of memory or array of data
|
||||
unsigned element_size; // how many bytes for each chunk
|
||||
unsigned element_count; // number of chunks of data
|
||||
unsigned head; // first chunk of data
|
||||
unsigned count; // number of chunks in use
|
||||
char *data; /* block of memory or array of data */
|
||||
unsigned element_size; /* how many bytes for each chunk */
|
||||
unsigned element_count; /* number of chunks of data */
|
||||
unsigned head; /* first chunk of data */
|
||||
unsigned count; /* number of chunks in use */
|
||||
};
|
||||
typedef struct ring_buffer_t RING_BUFFER;
|
||||
|
||||
@@ -58,12 +58,12 @@ extern "C" {
|
||||
bool Ringbuf_Empty(RING_BUFFER const *b);
|
||||
char *Ringbuf_Get_Front(RING_BUFFER const *b);
|
||||
char *Ringbuf_Pop_Front(RING_BUFFER * b);
|
||||
bool Ringbuf_Put(RING_BUFFER * b, // ring buffer structure
|
||||
char *data_element); // one element to add to the ring
|
||||
void Ringbuf_Init(RING_BUFFER * b, // ring buffer structure
|
||||
char *data, // data block or array of data
|
||||
unsigned element_size, // size of one element in the data block
|
||||
unsigned element_count); // number of elements in the data block
|
||||
bool Ringbuf_Put(RING_BUFFER * b, /* ring buffer structure */
|
||||
char *data_element); /* one element to add to the ring */
|
||||
void Ringbuf_Init(RING_BUFFER * b, /* ring buffer structure */
|
||||
char *data, /* data block or array of data */
|
||||
unsigned element_size, /* size of one element in the data block */
|
||||
unsigned element_count); /* number of elements in the data block */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
+36
-36
@@ -37,18 +37,18 @@
|
||||
#include "bacdef.h"
|
||||
#include "rp.h"
|
||||
|
||||
// encode service
|
||||
/* encode service */
|
||||
int rp_encode_apdu(uint8_t * apdu,
|
||||
uint8_t invoke_id, BACNET_READ_PROPERTY_DATA * data)
|
||||
{
|
||||
int len = 0; // length of each encoding
|
||||
int apdu_len = 0; // total length of the apdu, return value
|
||||
int len = 0; /* length of each encoding */
|
||||
int apdu_len = 0; /* total length of the apdu, return value */
|
||||
|
||||
if (apdu) {
|
||||
apdu[0] = PDU_TYPE_CONFIRMED_SERVICE_REQUEST;
|
||||
apdu[1] = encode_max_segs_max_apdu(0, MAX_APDU);
|
||||
apdu[2] = invoke_id;
|
||||
apdu[3] = SERVICE_CONFIRMED_READ_PROPERTY; // service choice
|
||||
apdu[3] = SERVICE_CONFIRMED_READ_PROPERTY; /* service choice */
|
||||
apdu_len = 4;
|
||||
len = encode_context_object_id(&apdu[apdu_len], 0,
|
||||
data->object_type, data->object_instance);
|
||||
@@ -67,32 +67,32 @@ int rp_encode_apdu(uint8_t * apdu,
|
||||
return apdu_len;
|
||||
}
|
||||
|
||||
// decode the service request only
|
||||
/* decode the service request only */
|
||||
int rp_decode_service_request(uint8_t * apdu,
|
||||
unsigned apdu_len, BACNET_READ_PROPERTY_DATA * data)
|
||||
{
|
||||
unsigned len = 0;
|
||||
uint8_t tag_number = 0;
|
||||
uint32_t len_value_type = 0;
|
||||
int type = 0; // for decoding
|
||||
int property = 0; // for decoding
|
||||
uint32_t array_value = 0; // for decoding
|
||||
int type = 0; /* for decoding */
|
||||
int property = 0; /* for decoding */
|
||||
uint32_t array_value = 0; /* for decoding */
|
||||
|
||||
// check for value pointers
|
||||
/* check for value pointers */
|
||||
if (apdu_len && data) {
|
||||
// Tag 0: Object ID
|
||||
/* Tag 0: Object ID */
|
||||
if (!decode_is_context_tag(&apdu[len++], 0))
|
||||
return -1;
|
||||
len += decode_object_id(&apdu[len], &type, &data->object_instance);
|
||||
data->object_type = type;
|
||||
// Tag 1: Property ID
|
||||
/* Tag 1: Property ID */
|
||||
len += decode_tag_number_and_value(&apdu[len],
|
||||
&tag_number, &len_value_type);
|
||||
if (tag_number != 1)
|
||||
return -1;
|
||||
len += decode_enumerated(&apdu[len], len_value_type, &property);
|
||||
data->object_property = property;
|
||||
// Tag 2: Optional Array Index
|
||||
/* Tag 2: Optional Array Index */
|
||||
if (len < apdu_len) {
|
||||
len += decode_tag_number_and_value(&apdu[len], &tag_number,
|
||||
&len_value_type);
|
||||
@@ -118,10 +118,10 @@ int rp_decode_apdu(uint8_t * apdu,
|
||||
|
||||
if (!apdu)
|
||||
return -1;
|
||||
// optional checking - most likely was already done prior to this call
|
||||
/* optional checking - most likely was already done prior to this call */
|
||||
if (apdu[0] != PDU_TYPE_CONFIRMED_SERVICE_REQUEST)
|
||||
return -1;
|
||||
// apdu[1] = encode_max_segs_max_apdu(0, Device_Max_APDU_Length_Accepted());
|
||||
/* apdu[1] = encode_max_segs_max_apdu(0, Device_Max_APDU_Length_Accepted()); */
|
||||
*invoke_id = apdu[2]; /* invoke id - filled in by net layer */
|
||||
if (apdu[3] != SERVICE_CONFIRMED_READ_PROPERTY)
|
||||
return -1;
|
||||
@@ -138,25 +138,25 @@ int rp_decode_apdu(uint8_t * apdu,
|
||||
int rp_ack_encode_apdu(uint8_t * apdu,
|
||||
uint8_t invoke_id, BACNET_READ_PROPERTY_DATA * data)
|
||||
{
|
||||
int len = 0; // length of each encoding
|
||||
int apdu_len = 0; // total length of the apdu, return value
|
||||
int len = 0; /* length of each encoding */
|
||||
int apdu_len = 0; /* total length of the apdu, return value */
|
||||
|
||||
if (apdu) {
|
||||
apdu[0] = PDU_TYPE_COMPLEX_ACK; /* complex ACK service */
|
||||
apdu[1] = invoke_id; /* original invoke id from request */
|
||||
apdu[2] = SERVICE_CONFIRMED_READ_PROPERTY; // service choice
|
||||
apdu[2] = SERVICE_CONFIRMED_READ_PROPERTY; /* service choice */
|
||||
apdu_len = 3;
|
||||
// service ack follows
|
||||
/* service ack follows */
|
||||
apdu_len += encode_context_object_id(&apdu[apdu_len], 0,
|
||||
data->object_type, data->object_instance);
|
||||
apdu_len += encode_context_enumerated(&apdu[apdu_len], 1,
|
||||
data->object_property);
|
||||
// context 2 array index is optional
|
||||
/* context 2 array index is optional */
|
||||
if (data->array_index != BACNET_ARRAY_ALL) {
|
||||
apdu_len += encode_context_unsigned(&apdu[apdu_len], 2,
|
||||
data->array_index);
|
||||
}
|
||||
// propertyValue
|
||||
/* propertyValue */
|
||||
apdu_len += encode_opening_tag(&apdu[apdu_len], 3);
|
||||
for (len = 0; len < data->application_data_len; len++) {
|
||||
apdu[apdu_len++] = data->application_data[len];
|
||||
@@ -167,31 +167,31 @@ int rp_ack_encode_apdu(uint8_t * apdu,
|
||||
return apdu_len;
|
||||
}
|
||||
|
||||
int rp_ack_decode_service_request(uint8_t * apdu, int apdu_len, // total length of the apdu
|
||||
int rp_ack_decode_service_request(uint8_t * apdu, int apdu_len, /* total length of the apdu */
|
||||
BACNET_READ_PROPERTY_DATA * data)
|
||||
{
|
||||
uint8_t tag_number = 0;
|
||||
uint32_t len_value_type = 0;
|
||||
int tag_len = 0; // length of tag decode
|
||||
int len = 0; // total length of decodes
|
||||
int object = 0, property = 0; // for decoding
|
||||
uint32_t array_value = 0; // for decoding
|
||||
int tag_len = 0; /* length of tag decode */
|
||||
int len = 0; /* total length of decodes */
|
||||
int object = 0, property = 0; /* for decoding */
|
||||
uint32_t array_value = 0; /* for decoding */
|
||||
|
||||
// FIXME: check apdu_len against the len during decode
|
||||
// Tag 0: Object ID
|
||||
/* FIXME: check apdu_len against the len during decode */
|
||||
/* Tag 0: Object ID */
|
||||
if (!decode_is_context_tag(&apdu[0], 0))
|
||||
return -1;
|
||||
len = 1;
|
||||
len += decode_object_id(&apdu[len], &object, &data->object_instance);
|
||||
data->object_type = object;
|
||||
// Tag 1: Property ID
|
||||
/* Tag 1: Property ID */
|
||||
len += decode_tag_number_and_value(&apdu[len],
|
||||
&tag_number, &len_value_type);
|
||||
if (tag_number != 1)
|
||||
return -1;
|
||||
len += decode_enumerated(&apdu[len], len_value_type, &property);
|
||||
data->object_property = property;
|
||||
// Tag 2: Optional Array Index
|
||||
/* Tag 2: Optional Array Index */
|
||||
tag_len = decode_tag_number_and_value(&apdu[len],
|
||||
&tag_number, &len_value_type);
|
||||
if (tag_number == 2) {
|
||||
@@ -201,11 +201,11 @@ int rp_ack_decode_service_request(uint8_t * apdu, int apdu_len, // total length
|
||||
} else
|
||||
data->array_index = BACNET_ARRAY_ALL;
|
||||
|
||||
// Tag 3: opening context tag */
|
||||
if (decode_is_opening_tag_number(&apdu[len], 3)) {
|
||||
// a tag number of 3 is not extended so only one octet
|
||||
/* Tag 3: opening context tag */ */
|
||||
if (decode_is_opening_tag_number(&apdu[len], 3)) {
|
||||
/* a tag number of 3 is not extended so only one octet */
|
||||
len++;
|
||||
// don't decode the application tag number or its data here
|
||||
/* don't decode the application tag number or its data here */
|
||||
data->application_data = &apdu[len];
|
||||
data->application_data_len = apdu_len - len - 1 /*closing tag */ ;
|
||||
} else
|
||||
@@ -214,7 +214,7 @@ int rp_ack_decode_service_request(uint8_t * apdu, int apdu_len, // total length
|
||||
return len;
|
||||
}
|
||||
|
||||
int rp_ack_decode_apdu(uint8_t * apdu, int apdu_len, // total length of the apdu
|
||||
int rp_ack_decode_apdu(uint8_t * apdu, int apdu_len, /* total length of the apdu */
|
||||
uint8_t * invoke_id, BACNET_READ_PROPERTY_DATA * data)
|
||||
{
|
||||
int len = 0;
|
||||
@@ -222,7 +222,7 @@ int rp_ack_decode_apdu(uint8_t * apdu, int apdu_len, // total length of the a
|
||||
|
||||
if (!apdu)
|
||||
return -1;
|
||||
// optional checking - most likely was already done prior to this call
|
||||
/* optional checking - most likely was already done prior to this call */
|
||||
if (apdu[0] != PDU_TYPE_COMPLEX_ACK)
|
||||
return -1;
|
||||
*invoke_id = apdu[1];
|
||||
@@ -269,7 +269,7 @@ void testReadPropertyAck(Test * pTest)
|
||||
ct_test(pTest, len != 0);
|
||||
ct_test(pTest, len != -1);
|
||||
apdu_len = len;
|
||||
len = rp_ack_decode_apdu(&apdu[0], apdu_len, // total length of the apdu
|
||||
len = rp_ack_decode_apdu(&apdu[0], apdu_len, /* total length of the apdu */
|
||||
&test_invoke_id, &test_data);
|
||||
ct_test(pTest, len != -1);
|
||||
ct_test(pTest, test_invoke_id == invoke_id);
|
||||
|
||||
+4
-4
@@ -50,11 +50,11 @@ typedef struct BACnet_Read_Property_Data {
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
// encode service
|
||||
/* encode service */
|
||||
int rp_encode_apdu(uint8_t * apdu,
|
||||
uint8_t invoke_id, BACNET_READ_PROPERTY_DATA * data);
|
||||
|
||||
// decode the service request only
|
||||
/* decode the service request only */
|
||||
int rp_decode_service_request(uint8_t * apdu,
|
||||
unsigned apdu_len, BACNET_READ_PROPERTY_DATA * data);
|
||||
|
||||
@@ -65,10 +65,10 @@ extern "C" {
|
||||
int rp_ack_encode_apdu(uint8_t * apdu,
|
||||
uint8_t invoke_id, BACNET_READ_PROPERTY_DATA * data);
|
||||
|
||||
int rp_ack_decode_service_request(uint8_t * apdu, int apdu_len, // total length of the apdu
|
||||
int rp_ack_decode_service_request(uint8_t * apdu, int apdu_len, /* total length of the apdu */
|
||||
BACNET_READ_PROPERTY_DATA * data);
|
||||
|
||||
int rp_ack_decode_apdu(uint8_t * apdu, int apdu_len, // total length of the apdu
|
||||
int rp_ack_decode_apdu(uint8_t * apdu, int apdu_len, /* total length of the apdu */
|
||||
uint8_t * invoke_id, BACNET_READ_PROPERTY_DATA * data);
|
||||
|
||||
|
||||
|
||||
@@ -45,11 +45,11 @@ extern "C" {
|
||||
|
||||
void RS485_Initialize(void);
|
||||
|
||||
void RS485_Send_Frame(volatile struct mstp_port_struct_t *mstp_port, // port specific data
|
||||
uint8_t * buffer, // frame to send (up to 501 bytes of data)
|
||||
uint16_t nbytes); // number of bytes of data (up to 501)
|
||||
void RS485_Send_Frame(volatile struct mstp_port_struct_t *mstp_port, /* port specific data */
|
||||
uint8_t * buffer, /* frame to send (up to 501 bytes of data) */
|
||||
uint16_t nbytes); /* number of bytes of data (up to 501) */
|
||||
|
||||
void RS485_Check_UART_Data(volatile struct mstp_port_struct_t *mstp_port); // port specific data
|
||||
void RS485_Check_UART_Data(volatile struct mstp_port_struct_t *mstp_port); /* port specific data */
|
||||
|
||||
void RS485_Process_Tx_Message(void);
|
||||
|
||||
|
||||
+32
-32
@@ -34,7 +34,7 @@
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
#include <string.h> // memmove()
|
||||
#include <string.h> /* memmove() */
|
||||
#include "bits.h"
|
||||
#include "apdu.h"
|
||||
#include "bacdef.h"
|
||||
@@ -47,23 +47,23 @@
|
||||
#include "handlers.h"
|
||||
#include "address.h"
|
||||
|
||||
// Transaction State Machine
|
||||
// Really only needed for segmented messages
|
||||
// and a little for sending confirmed messages
|
||||
// If we are only a server and only initiate broadcasts,
|
||||
// then we don't need a TSM layer.
|
||||
/* Transaction State Machine */
|
||||
/* Really only needed for segmented messages */
|
||||
/* and a little for sending confirmed messages */
|
||||
/* If we are only a server and only initiate broadcasts, */
|
||||
/* then we don't need a TSM layer. */
|
||||
|
||||
// FIXME: not coded for segmentation
|
||||
/* FIXME: not coded for segmentation */
|
||||
|
||||
// declare space for the TSM transactions, and set it up in the init.
|
||||
/* declare space for the TSM transactions, and set it up in the init. */
|
||||
/* table rules: an Invoke ID = 0 is an unused spot in the table */
|
||||
static BACNET_TSM_DATA TSM_List[MAX_TSM_TRANSACTIONS] = { {0} };
|
||||
|
||||
// returns MAX_TSM_TRANSACTIONS if not found
|
||||
/* returns MAX_TSM_TRANSACTIONS if not found */
|
||||
static uint8_t tsm_find_invokeID_index(uint8_t invokeID)
|
||||
{
|
||||
unsigned i = 0; // counter
|
||||
uint8_t index = MAX_TSM_TRANSACTIONS; // return value
|
||||
unsigned i = 0; /* counter */
|
||||
uint8_t index = MAX_TSM_TRANSACTIONS; /* return value */
|
||||
|
||||
for (i = 0; i < MAX_TSM_TRANSACTIONS; i++) {
|
||||
if (TSM_List[i].InvokeID == invokeID) {
|
||||
@@ -77,8 +77,8 @@ static uint8_t tsm_find_invokeID_index(uint8_t invokeID)
|
||||
|
||||
static uint8_t tsm_find_first_free_index(void)
|
||||
{
|
||||
unsigned i = 0; // counter
|
||||
uint8_t index = MAX_TSM_TRANSACTIONS; // return value
|
||||
unsigned i = 0; /* counter */
|
||||
uint8_t index = MAX_TSM_TRANSACTIONS; /* return value */
|
||||
|
||||
for (i = 0; i < MAX_TSM_TRANSACTIONS; i++) {
|
||||
if (TSM_List[i].InvokeID == 0) {
|
||||
@@ -92,12 +92,12 @@ static uint8_t tsm_find_first_free_index(void)
|
||||
|
||||
bool tsm_transaction_available(void)
|
||||
{
|
||||
bool status = false; // return value
|
||||
unsigned i = 0; // counter
|
||||
bool status = false; /* return value */
|
||||
unsigned i = 0; /* counter */
|
||||
|
||||
for (i = 0; i < MAX_TSM_TRANSACTIONS; i++) {
|
||||
if (TSM_List[i].InvokeID == 0) {
|
||||
// one is available!
|
||||
/* one is available! */
|
||||
status = true;
|
||||
break;
|
||||
}
|
||||
@@ -108,13 +108,13 @@ bool tsm_transaction_available(void)
|
||||
|
||||
uint8_t tsm_transaction_idle_count(void)
|
||||
{
|
||||
uint8_t count = 0; // return value
|
||||
unsigned i = 0; // counter
|
||||
uint8_t count = 0; /* return value */
|
||||
unsigned i = 0; /* counter */
|
||||
|
||||
for (i = 0; i < MAX_TSM_TRANSACTIONS; i++) {
|
||||
if ((TSM_List[i].InvokeID == 0) &&
|
||||
(TSM_List[i].state == TSM_STATE_IDLE)) {
|
||||
// one is available!
|
||||
/* one is available! */
|
||||
count++;
|
||||
}
|
||||
}
|
||||
@@ -127,7 +127,7 @@ uint8_t tsm_transaction_idle_count(void)
|
||||
returns 0 if none are available */
|
||||
uint8_t tsm_next_free_invokeID(void)
|
||||
{
|
||||
static uint8_t current_invokeID = 1; // incremented...
|
||||
static uint8_t current_invokeID = 1; /* incremented... */
|
||||
uint8_t index = 0;
|
||||
uint8_t invokeID = 0;
|
||||
bool found = false;
|
||||
@@ -145,7 +145,7 @@ uint8_t tsm_next_free_invokeID(void)
|
||||
TSM_List[index].RequestTimer = Device_APDU_Timeout();
|
||||
/* update for the next call or check */
|
||||
current_invokeID++;
|
||||
// skip zero - we treat that internally as invalid or no free
|
||||
/* skip zero - we treat that internally as invalid or no free */
|
||||
if (current_invokeID == 0)
|
||||
current_invokeID = 1;
|
||||
}
|
||||
@@ -164,12 +164,12 @@ void tsm_set_confirmed_unsegmented_transaction(uint8_t invokeID,
|
||||
if (invokeID) {
|
||||
index = tsm_find_invokeID_index(invokeID);
|
||||
if (index < MAX_TSM_TRANSACTIONS) {
|
||||
// assign the transaction
|
||||
/* assign the transaction */
|
||||
TSM_List[index].state = TSM_STATE_AWAIT_CONFIRMATION;
|
||||
TSM_List[index].RetryCount = Device_Number_Of_APDU_Retries();
|
||||
// start the timer
|
||||
/* start the timer */
|
||||
TSM_List[index].RequestTimer = Device_APDU_Timeout();
|
||||
// copy the data
|
||||
/* copy the data */
|
||||
for (j = 0; j < pdu_len; j++) {
|
||||
TSM_List[index].pdu[j] = pdu[j];
|
||||
}
|
||||
@@ -181,8 +181,8 @@ void tsm_set_confirmed_unsegmented_transaction(uint8_t invokeID,
|
||||
return;
|
||||
}
|
||||
|
||||
// used to retrieve the transaction payload
|
||||
// if we wanted to find out what we sent (i.e. when we get an ack)
|
||||
/* used to retrieve the transaction payload */
|
||||
/* if we wanted to find out what we sent (i.e. when we get an ack) */
|
||||
bool tsm_get_transaction_pdu(uint8_t invokeID,
|
||||
BACNET_ADDRESS * dest, uint8_t * pdu, uint16_t * pdu_len)
|
||||
{
|
||||
@@ -192,11 +192,11 @@ bool tsm_get_transaction_pdu(uint8_t invokeID,
|
||||
|
||||
if (invokeID) {
|
||||
index = tsm_find_invokeID_index(invokeID);
|
||||
// how much checking is needed? state? dest match? just invokeID?
|
||||
/* how much checking is needed? state? dest match? just invokeID? */
|
||||
if (index < MAX_TSM_TRANSACTIONS) {
|
||||
// FIXME: we may want to free the transaction so it doesn't timeout
|
||||
// retrieve the transaction
|
||||
// FIXME: bounds check the pdu_len?
|
||||
/* FIXME: we may want to free the transaction so it doesn't timeout */
|
||||
/* retrieve the transaction */
|
||||
/* FIXME: bounds check the pdu_len? */
|
||||
*pdu_len = TSM_List[index].pdu_len;
|
||||
for (j = 0; j < *pdu_len; j++) {
|
||||
pdu[j] = TSM_List[index].pdu[j];
|
||||
@@ -212,7 +212,7 @@ bool tsm_get_transaction_pdu(uint8_t invokeID,
|
||||
/* called once a millisecond or slower */
|
||||
void tsm_timer_milliseconds(uint16_t milliseconds)
|
||||
{
|
||||
unsigned i = 0; // counter
|
||||
unsigned i = 0; /* counter */
|
||||
int bytes_sent = 0;
|
||||
|
||||
for (i = 0; i < MAX_TSM_TRANSACTIONS; i++) {
|
||||
@@ -266,7 +266,7 @@ bool tsm_invoke_id_free(uint8_t invokeID)
|
||||
#include <string.h>
|
||||
#include "ctest.h"
|
||||
|
||||
// flag to send an I-Am
|
||||
/* flag to send an I-Am */
|
||||
bool I_Am_Request = true;
|
||||
|
||||
void testTSM(Test * pTest)
|
||||
|
||||
+29
-29
@@ -50,37 +50,37 @@ typedef enum {
|
||||
TSM_STATE_SEGMENTED_CONFIRMATION
|
||||
} BACNET_TSM_STATE;
|
||||
|
||||
// 5.4.1 Variables And Parameters
|
||||
// The following variables are defined for each instance of
|
||||
// Transaction State Machine:
|
||||
/* 5.4.1 Variables And Parameters */
|
||||
/* The following variables are defined for each instance of */
|
||||
/* Transaction State Machine: */
|
||||
typedef struct BACnet_TSM_Data {
|
||||
// used to count APDU retries
|
||||
/* used to count APDU retries */
|
||||
uint8_t RetryCount;
|
||||
// used to count segment retries
|
||||
//uint8_t SegmentRetryCount;
|
||||
// used to control APDU retries and the acceptance of server replies
|
||||
//bool SentAllSegments;
|
||||
// stores the sequence number of the last segment received in order
|
||||
//uint8_t LastSequenceNumber;
|
||||
// stores the sequence number of the first segment of
|
||||
// a sequence of segments that fill a window
|
||||
//uint8_t InitialSequenceNumber;
|
||||
// stores the current window size
|
||||
//uint8_t ActualWindowSize;
|
||||
// stores the window size proposed by the segment sender
|
||||
//uint8_t ProposedWindowSize;
|
||||
// used to perform timeout on PDU segments
|
||||
//uint8_t SegmentTimer;
|
||||
// used to perform timeout on Confirmed Requests
|
||||
// in milliseconds
|
||||
/* used to count segment retries */
|
||||
/*uint8_t SegmentRetryCount; */
|
||||
/* used to control APDU retries and the acceptance of server replies */
|
||||
/*bool SentAllSegments; */
|
||||
/* stores the sequence number of the last segment received in order */
|
||||
/*uint8_t LastSequenceNumber; */
|
||||
/* stores the sequence number of the first segment of */
|
||||
/* a sequence of segments that fill a window */
|
||||
/*uint8_t InitialSequenceNumber; */
|
||||
/* stores the current window size */
|
||||
/*uint8_t ActualWindowSize; */
|
||||
/* stores the window size proposed by the segment sender */
|
||||
/*uint8_t ProposedWindowSize; */
|
||||
/* used to perform timeout on PDU segments */
|
||||
/*uint8_t SegmentTimer; */
|
||||
/* used to perform timeout on Confirmed Requests */
|
||||
/* in milliseconds */
|
||||
uint16_t RequestTimer;
|
||||
// unique id
|
||||
/* unique id */
|
||||
uint8_t InvokeID;
|
||||
// state that the TSM is in
|
||||
/* state that the TSM is in */
|
||||
BACNET_TSM_STATE state;
|
||||
// the address we sent it to
|
||||
/* the address we sent it to */
|
||||
BACNET_ADDRESS dest;
|
||||
// copy of the PDU, should we need to send it again
|
||||
/* copy of the PDU, should we need to send it again */
|
||||
uint8_t pdu[MAX_PDU];
|
||||
unsigned pdu_len;
|
||||
} BACNET_TSM_DATA;
|
||||
@@ -92,14 +92,14 @@ extern "C" {
|
||||
bool tsm_transaction_available(void);
|
||||
uint8_t tsm_transaction_idle_count(void);
|
||||
void tsm_timer_milliseconds(uint16_t milliseconds);
|
||||
// free the invoke ID when the reply comes back
|
||||
/* free the invoke ID when the reply comes back */
|
||||
void tsm_free_invoke_id(uint8_t invokeID);
|
||||
// use these in tandem
|
||||
/* use these in tandem */
|
||||
uint8_t tsm_next_free_invokeID(void);
|
||||
// returns the same invoke ID that was given
|
||||
/* returns the same invoke ID that was given */
|
||||
void tsm_set_confirmed_unsegmented_transaction(uint8_t invokeID,
|
||||
BACNET_ADDRESS * dest, uint8_t * pdu, uint16_t pdu_len);
|
||||
// returns true if transaction is found
|
||||
/* returns true if transaction is found */
|
||||
bool tsm_get_transaction_pdu(uint8_t invokeID,
|
||||
BACNET_ADDRESS * dest, uint8_t * pdu, uint16_t * pdu_len);
|
||||
|
||||
|
||||
@@ -41,14 +41,14 @@
|
||||
|
||||
int whohas_encode_apdu(uint8_t * apdu, BACNET_WHO_HAS_DATA * data)
|
||||
{
|
||||
int len = 0; // length of each encoding
|
||||
int apdu_len = 0; // total length of the apdu, return value
|
||||
int len = 0; /* length of each encoding */
|
||||
int apdu_len = 0; /* total length of the apdu, return value */
|
||||
|
||||
if (apdu && data) {
|
||||
apdu[0] = PDU_TYPE_UNCONFIRMED_SERVICE_REQUEST;
|
||||
apdu[1] = SERVICE_UNCONFIRMED_WHO_HAS; // service choice
|
||||
apdu[1] = SERVICE_UNCONFIRMED_WHO_HAS; /* service choice */
|
||||
apdu_len = 2;
|
||||
// optional limits - must be used as a pair
|
||||
/* optional limits - must be used as a pair */
|
||||
if ((data->low_limit >= 0)
|
||||
&& (data->low_limit <= BACNET_MAX_INSTANCE)
|
||||
&& (data->high_limit >= 0)
|
||||
@@ -77,7 +77,7 @@ int whohas_encode_apdu(uint8_t * apdu, BACNET_WHO_HAS_DATA * data)
|
||||
return apdu_len;
|
||||
}
|
||||
|
||||
// decode the service request only
|
||||
/* decode the service request only */
|
||||
int whohas_decode_service_request(uint8_t * apdu,
|
||||
unsigned apdu_len, BACNET_WHO_HAS_DATA * data)
|
||||
{
|
||||
@@ -144,12 +144,12 @@ int whohas_decode_apdu(uint8_t * apdu,
|
||||
|
||||
if (!apdu)
|
||||
return -1;
|
||||
// optional checking - most likely was already done prior to this call
|
||||
/* optional checking - most likely was already done prior to this call */
|
||||
if (apdu[0] != PDU_TYPE_UNCONFIRMED_SERVICE_REQUEST)
|
||||
return -1;
|
||||
if (apdu[1] != SERVICE_UNCONFIRMED_WHO_IS)
|
||||
return -1;
|
||||
// optional limits - must be used as a pair
|
||||
/* optional limits - must be used as a pair */
|
||||
if (apdu_len > 2) {
|
||||
len = whohas_decode_service_request(&apdu[2], apdu_len - 2, data);
|
||||
}
|
||||
|
||||
@@ -52,7 +52,7 @@ typedef struct BACnet_Who_Has_Data {
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
// encode service - use -1 for limit if you want unlimited
|
||||
/* encode service - use -1 for limit if you want unlimited */
|
||||
int whohas_encode_apdu(uint8_t * apdu, BACNET_WHO_HAS_DATA * data);
|
||||
|
||||
int whohas_decode_service_request(uint8_t * apdu,
|
||||
|
||||
@@ -36,18 +36,18 @@
|
||||
#include "bacdcode.h"
|
||||
#include "bacdef.h"
|
||||
|
||||
// encode I-Am service - use -1 for limit if you want unlimited
|
||||
/* encode I-Am service - use -1 for limit if you want unlimited */
|
||||
int whois_encode_apdu(uint8_t * apdu,
|
||||
int32_t low_limit, int32_t high_limit)
|
||||
{
|
||||
int len = 0; // length of each encoding
|
||||
int apdu_len = 0; // total length of the apdu, return value
|
||||
int len = 0; /* length of each encoding */
|
||||
int apdu_len = 0; /* total length of the apdu, return value */
|
||||
|
||||
if (apdu) {
|
||||
apdu[0] = PDU_TYPE_UNCONFIRMED_SERVICE_REQUEST;
|
||||
apdu[1] = SERVICE_UNCONFIRMED_WHO_IS; // service choice
|
||||
apdu[1] = SERVICE_UNCONFIRMED_WHO_IS; /* service choice */
|
||||
apdu_len = 2;
|
||||
// optional limits - must be used as a pair
|
||||
/* optional limits - must be used as a pair */
|
||||
if ((low_limit >= 0) && (low_limit <= BACNET_MAX_INSTANCE) &&
|
||||
(high_limit >= 0) && (high_limit <= BACNET_MAX_INSTANCE)) {
|
||||
len = encode_context_unsigned(&apdu[apdu_len], 0, low_limit);
|
||||
@@ -60,7 +60,7 @@ int whois_encode_apdu(uint8_t * apdu,
|
||||
return apdu_len;
|
||||
}
|
||||
|
||||
// decode the service request only
|
||||
/* decode the service request only */
|
||||
int whois_decode_service_request(uint8_t * apdu,
|
||||
unsigned apdu_len, int32_t * pLow_limit, int32_t * pHigh_limit)
|
||||
{
|
||||
@@ -69,7 +69,7 @@ int whois_decode_service_request(uint8_t * apdu,
|
||||
uint32_t len_value = 0;
|
||||
uint32_t decoded_value = 0;
|
||||
|
||||
// optional limits - must be used as a pair
|
||||
/* optional limits - must be used as a pair */
|
||||
if (apdu_len) {
|
||||
len +=
|
||||
decode_tag_number_and_value(&apdu[len], &tag_number,
|
||||
@@ -103,12 +103,12 @@ int whois_decode_apdu(uint8_t * apdu,
|
||||
|
||||
if (!apdu)
|
||||
return -1;
|
||||
// optional checking - most likely was already done prior to this call
|
||||
/* optional checking - most likely was already done prior to this call */
|
||||
if (apdu[0] != PDU_TYPE_UNCONFIRMED_SERVICE_REQUEST)
|
||||
return -1;
|
||||
if (apdu[1] != SERVICE_UNCONFIRMED_WHO_IS)
|
||||
return -1;
|
||||
// optional limits - must be used as a pair
|
||||
/* optional limits - must be used as a pair */
|
||||
if (apdu_len > 2) {
|
||||
len = whois_decode_service_request(&apdu[2],
|
||||
apdu_len - 2, pLow_limit, pHigh_limit);
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
// encode service - use -1 for limit if you want unlimited
|
||||
/* encode service - use -1 for limit if you want unlimited */
|
||||
int whois_encode_apdu(uint8_t * apdu,
|
||||
int32_t low_limit, int32_t high_limit);
|
||||
|
||||
|
||||
+19
-19
@@ -38,18 +38,18 @@
|
||||
#include "device.h"
|
||||
#include "wp.h"
|
||||
|
||||
// encode service
|
||||
/* encode service */
|
||||
int wp_encode_apdu(uint8_t * apdu,
|
||||
uint8_t invoke_id, BACNET_WRITE_PROPERTY_DATA * data)
|
||||
{
|
||||
int apdu_len = 0; // total length of the apdu, return value
|
||||
int apdu_len = 0; /* total length of the apdu, return value */
|
||||
|
||||
if (apdu) {
|
||||
apdu[0] = PDU_TYPE_CONFIRMED_SERVICE_REQUEST;
|
||||
apdu[1] =
|
||||
encode_max_segs_max_apdu(0, Device_Max_APDU_Length_Accepted());
|
||||
apdu[2] = invoke_id;
|
||||
apdu[3] = SERVICE_CONFIRMED_WRITE_PROPERTY; // service choice
|
||||
apdu[3] = SERVICE_CONFIRMED_WRITE_PROPERTY; /* service choice */
|
||||
apdu_len = 4;
|
||||
apdu_len += encode_context_object_id(&apdu[apdu_len], 0,
|
||||
data->object_type, data->object_instance);
|
||||
@@ -59,12 +59,12 @@ int wp_encode_apdu(uint8_t * apdu,
|
||||
if (data->array_index != BACNET_ARRAY_ALL)
|
||||
apdu_len += encode_context_unsigned(&apdu[apdu_len], 2,
|
||||
data->array_index);
|
||||
// propertyValue
|
||||
/* propertyValue */
|
||||
apdu_len += encode_opening_tag(&apdu[apdu_len], 3);
|
||||
apdu_len +=
|
||||
bacapp_encode_application_data(&apdu[apdu_len], &data->value);
|
||||
apdu_len += encode_closing_tag(&apdu[apdu_len], 3);
|
||||
// optional priority - 0 if not set, 1..16 if set
|
||||
/* optional priority - 0 if not set, 1..16 if set */
|
||||
if (data->priority != BACNET_NO_PRIORITY)
|
||||
apdu_len += encode_context_unsigned(&apdu[apdu_len], 4,
|
||||
data->priority);
|
||||
@@ -83,26 +83,26 @@ int wp_decode_service_request(uint8_t * apdu,
|
||||
int tag_len = 0;
|
||||
uint8_t tag_number = 0;
|
||||
uint32_t len_value_type = 0;
|
||||
int type = 0; // for decoding
|
||||
int property = 0; // for decoding
|
||||
int type = 0; /* for decoding */
|
||||
int property = 0; /* for decoding */
|
||||
uint32_t unsigned_value = 0;
|
||||
|
||||
// check for value pointers
|
||||
/* check for value pointers */
|
||||
if (apdu_len && data) {
|
||||
// Tag 0: Object ID
|
||||
/* Tag 0: Object ID */
|
||||
if (!decode_is_context_tag(&apdu[len++], 0))
|
||||
return -1;
|
||||
len += decode_object_id(&apdu[len], &type, &data->object_instance);
|
||||
data->object_type = type;
|
||||
// Tag 1: Property ID
|
||||
/* Tag 1: Property ID */
|
||||
len += decode_tag_number_and_value(&apdu[len],
|
||||
&tag_number, &len_value_type);
|
||||
if (tag_number != 1)
|
||||
return -1;
|
||||
len += decode_enumerated(&apdu[len], len_value_type, &property);
|
||||
data->object_property = property;
|
||||
// Tag 2: Optional Array Index
|
||||
// note: decode without incrementing len so we can check for opening tag
|
||||
/* Tag 2: Optional Array Index */
|
||||
/* note: decode without incrementing len so we can check for opening tag */
|
||||
tag_len = decode_tag_number_and_value(&apdu[len],
|
||||
&tag_number, &len_value_type);
|
||||
if (tag_number == 2) {
|
||||
@@ -112,10 +112,10 @@ int wp_decode_service_request(uint8_t * apdu,
|
||||
data->array_index = unsigned_value;
|
||||
} else
|
||||
data->array_index = BACNET_ARRAY_ALL;
|
||||
// Tag 3: opening context tag */
|
||||
if (!decode_is_opening_tag_number(&apdu[len], 3))
|
||||
/* Tag 3: opening context tag */ */
|
||||
if (!decode_is_opening_tag_number(&apdu[len], 3))
|
||||
return -1;
|
||||
// a tag number of 3 is not extended so only one octet
|
||||
/* a tag number of 3 is not extended so only one octet */
|
||||
len++;
|
||||
len += bacapp_decode_application_data(&apdu[len],
|
||||
apdu_len - len, &data->value);
|
||||
@@ -123,9 +123,9 @@ int wp_decode_service_request(uint8_t * apdu,
|
||||
/* FIXME: there might be more than one data element in here! */
|
||||
if (!decode_is_closing_tag_number(&apdu[len], 3))
|
||||
return -1;
|
||||
// a tag number of 3 is not extended so only one octet
|
||||
/* a tag number of 3 is not extended so only one octet */
|
||||
len++;
|
||||
// Tag 4: optional Priority - assumed MAX if not explicitly set
|
||||
/* Tag 4: optional Priority - assumed MAX if not explicitly set */
|
||||
data->priority = BACNET_MAX_PRIORITY;
|
||||
if ((unsigned) len < apdu_len) {
|
||||
tag_len = decode_tag_number_and_value(&apdu[len],
|
||||
@@ -156,10 +156,10 @@ int wp_decode_apdu(uint8_t * apdu,
|
||||
|
||||
if (!apdu)
|
||||
return -1;
|
||||
// optional checking - most likely was already done prior to this call
|
||||
/* optional checking - most likely was already done prior to this call */
|
||||
if (apdu[0] != PDU_TYPE_CONFIRMED_SERVICE_REQUEST)
|
||||
return -1;
|
||||
// apdu[1] = encode_max_segs_max_apdu(0, Device_Max_APDU_Length_Accepted());
|
||||
/* apdu[1] = encode_max_segs_max_apdu(0, Device_Max_APDU_Length_Accepted()); */
|
||||
*invoke_id = apdu[2]; /* invoke id - filled in by net layer */
|
||||
if (apdu[3] != SERVICE_CONFIRMED_WRITE_PROPERTY)
|
||||
return -1;
|
||||
|
||||
+4
-4
@@ -43,20 +43,20 @@ typedef struct BACnet_Write_Property_Data {
|
||||
BACNET_OBJECT_TYPE object_type;
|
||||
uint32_t object_instance;
|
||||
BACNET_PROPERTY_ID object_property;
|
||||
int32_t array_index; // use BACNET_ARRAY_ALL when not setting
|
||||
int32_t array_index; /* use BACNET_ARRAY_ALL when not setting */
|
||||
BACNET_APPLICATION_DATA_VALUE value;
|
||||
uint8_t priority; // use 0 if not setting the priority
|
||||
uint8_t priority; /* use 0 if not setting the priority */
|
||||
} BACNET_WRITE_PROPERTY_DATA;
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
// encode service
|
||||
/* encode service */
|
||||
int wp_encode_apdu(uint8_t * apdu,
|
||||
uint8_t invoke_id, BACNET_WRITE_PROPERTY_DATA * data);
|
||||
|
||||
// decode the service request only
|
||||
/* decode the service request only */
|
||||
int wp_decode_service_request(uint8_t * apdu,
|
||||
unsigned apdu_len, BACNET_WRITE_PROPERTY_DATA * data);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user