Feature/makefile add apps library (#218)

* add BACnet stack library at apps/lib

* convert apps to use apps/lib for smaller binary

* fix -DBACDL_ALL=1 build

* fix piface build

* datalink MAX_MPDU and MAX_HEADER cleanup

* add bip6 to git workflow

* fix system library dependency of BACnet library

Co-authored-by: Steve Karg <skarg@users.sourceforge.net>
This commit is contained in:
Steve Karg
2022-01-29 15:55:40 -06:00
committed by GitHub
parent 9c72572692
commit 295f127c2b
79 changed files with 917 additions and 1104 deletions
+2 -2
View File
@@ -32,8 +32,8 @@
#include "bacnet/npdu.h"
/* specific defines for ARCNET */
#define MAX_HEADER (1+1+2+2+1+1+1+1)
#define MAX_MPDU (MAX_HEADER+MAX_PDU)
#define ARCNET_HEADER_MAX (1+1+2+2+1+1+1+1)
#define ARCNET_MPDU_MAX (ARCNET_HEADER_MAX+MAX_PDU)
#ifdef __cplusplus
extern "C" {
-2
View File
@@ -35,8 +35,6 @@
/* specific defines for BACnet/IP over Ethernet */
#define BIP_HEADER_MAX (1 + 1 + 2)
#define BIP_MPDU_MAX (BIP_HEADER_MAX + MAX_PDU)
/* for legacy demo applications */
#define MAX_MPDU BIP_MPDU_MAX
#ifdef __cplusplus
extern "C" {
-2
View File
@@ -24,8 +24,6 @@
/* specific defines for BACnet/IP over Ethernet */
#define BIP6_HEADER_MAX (1 + 1 + 2)
#define BIP6_MPDU_MAX (BIP6_HEADER_MAX+MAX_PDU)
/* for legacy demo applications */
#define MAX_MPDU BIP6_MPDU_MAX
#ifdef __cplusplus
extern "C" {
+245 -85
View File
@@ -37,104 +37,264 @@
#if defined(BACDL_ALL) || defined FOR_DOXYGEN
#include "bacnet/datalink/ethernet.h"
#include "bacnet/datalink/bip.h"
#include "bacnet/datalink/bip6.h"
#include "bacnet/datalink/bvlc.h"
#include "bacnet/basic/bbmd/h_bbmd.h"
#include "bacnet/datalink/bip6.h"
#include "bacnet/datalink/bvlc6.h"
#include "bacnet/basic/bbmd6/h_bbmd6.h"
#include "bacnet/datalink/arcnet.h"
#include "bacnet/datalink/dlmstp.h"
#include <string.h>
/* Function pointers - point to your datalink */
/** Function template to Initialize the DataLink services at the given
interface.
* @ingroup DLTemplates
*
* @note For Linux, ifname is eth0, ath0, arc0, ttyS0, and others.
For Windows, ifname is the COM port or dotted ip address of the
interface.
* @param ifname [in] The named interface to use for the network layer.
* @return True if the interface is successfully initialized,
* else False if the initialization fails.
*/
bool (*datalink_init)(char *ifname);
/** Function template to send a packet via the DataLink.
* @ingroup DLTemplates
*
* @param dest [in] Destination address.
* @param npdu_data [in] The NPDU header (Network) information.
* @param pdu [in] Buffer of data to be sent - may be null.
* @param pdu_len [in] Number of bytes in the pdu buffer.
* @return Number of bytes sent on success, negative number on failure.
*/
int (*datalink_send_pdu)(BACNET_ADDRESS *dest,
BACNET_NPDU_DATA *npdu_data,
uint8_t *pdu,
unsigned pdu_len);
uint16_t (*datalink_receive)(
BACNET_ADDRESS *src, uint8_t *pdu, uint16_t max_pdu, unsigned timeout);
/** Function template to close the DataLink services and perform any cleanup.
* @ingroup DLTemplates
*/
void (*datalink_cleanup)(void);
void (*datalink_get_broadcast_address)(BACNET_ADDRESS *dest);
void (*datalink_get_my_address)(BACNET_ADDRESS *my_address);
static enum {
DATALINK_NONE = 0,
DATALINK_ARCNET,
DATALINK_ETHERNET,
DATALINK_BIP,
DATALINK_BIP6,
DATALINK_MSTP
} Datalink_Transport;
void datalink_set(char *datalink_string)
{
if (strcasecmp("bip", datalink_string) == 0) {
datalink_init = bip_init;
datalink_send_pdu = bip_send_pdu;
datalink_receive = bip_receive;
datalink_cleanup = bip_cleanup;
datalink_get_broadcast_address = bip_get_broadcast_address;
datalink_get_my_address = bip_get_my_address;
} else if (strcasecmp("bvlc", datalink_string) == 0) {
datalink_init = bip_init;
datalink_send_pdu = bvlc_send_pdu;
datalink_receive = bvlc_receive;
datalink_cleanup = bip_cleanup;
datalink_get_broadcast_address = bip_get_broadcast_address;
datalink_get_my_address = bip_get_my_address;
Datalink_Transport = DATALINK_BIP;
} else if (strcasecmp("bip6", datalink_string) == 0) {
datalink_init = bip6_init;
datalink_send_pdu = bip6_send_pdu;
datalink_receive = bip6_receive;
datalink_cleanup = bip6_cleanup;
datalink_get_broadcast_address = bip6_get_broadcast_address;
datalink_get_my_address = bip6_get_my_address;
} else if (strcasecmp("bvlc6", datalink_string) == 0) {
datalink_init = bip6_init;
datalink_send_pdu = bvlc6_send_pdu;
datalink_receive = bvlc6_receive;
datalink_cleanup = bip6_cleanup;
datalink_get_broadcast_address = bip6_get_broadcast_address;
datalink_get_my_address = bip6_get_my_address;
Datalink_Transport = DATALINK_BIP6;
} else if (strcasecmp("ethernet", datalink_string) == 0) {
datalink_init = ethernet_init;
datalink_send_pdu = ethernet_send_pdu;
datalink_receive = ethernet_receive;
datalink_cleanup = ethernet_cleanup;
datalink_get_broadcast_address = ethernet_get_broadcast_address;
datalink_get_my_address = ethernet_get_my_address;
Datalink_Transport = DATALINK_ETHERNET;
} else if (strcasecmp("arcnet", datalink_string) == 0) {
datalink_init = arcnet_init;
datalink_send_pdu = arcnet_send_pdu;
datalink_receive = arcnet_receive;
datalink_cleanup = arcnet_cleanup;
datalink_get_broadcast_address = arcnet_get_broadcast_address;
datalink_get_my_address = arcnet_get_my_address;
Datalink_Transport = DATALINK_ARCNET;
} else if (strcasecmp("mstp", datalink_string) == 0) {
datalink_init = dlmstp_init;
datalink_send_pdu = dlmstp_send_pdu;
datalink_receive = dlmstp_receive;
datalink_cleanup = dlmstp_cleanup;
datalink_get_broadcast_address = dlmstp_get_broadcast_address;
datalink_get_my_address = dlmstp_get_my_address;
Datalink_Transport = DATALINK_MSTP;
} else if (strcasecmp("none", datalink_string) == 0) {
Datalink_Transport = DATALINK_NONE;
}
}
bool datalink_init(char *ifname)
{
bool status = false;
switch (Datalink_Transport) {
case DATALINK_NONE:
status = true;
break;
case DATALINK_ARCNET:
status = arcnet_init(ifname);
break;
case DATALINK_ETHERNET:
status = ethernet_init(ifname);
break;
case DATALINK_BIP:
status = bip_init(ifname);
break;
case DATALINK_BIP6:
status = bip6_init(ifname);
break;
case DATALINK_MSTP:
status = dlmstp_init(ifname);
break;
default:
break;
}
return status;
}
int datalink_send_pdu(BACNET_ADDRESS *dest,
BACNET_NPDU_DATA *npdu_data,
uint8_t *pdu,
unsigned pdu_len)
{
int bytes = 0;
switch (Datalink_Transport) {
case DATALINK_NONE:
bytes = pdu_len;
break;
case DATALINK_ARCNET:
bytes = arcnet_send_pdu(
dest, npdu_data, pdu, pdu_len);
break;
case DATALINK_ETHERNET:
bytes = ethernet_send_pdu(
dest, npdu_data, pdu, pdu_len);
break;
case DATALINK_BIP:
bytes = bip_send_pdu(
dest, npdu_data, pdu, pdu_len);
break;
case DATALINK_BIP6:
bytes = bip6_send_pdu(
dest, npdu_data, pdu, pdu_len);
break;
case DATALINK_MSTP:
bytes = dlmstp_send_pdu(
dest, npdu_data, pdu, pdu_len);
break;
default:
break;
}
return bytes;
}
uint16_t datalink_receive(
BACNET_ADDRESS *src, uint8_t *pdu, uint16_t max_pdu, unsigned timeout)
{
uint16_t bytes = 0;
switch (Datalink_Transport) {
case DATALINK_NONE:
break;
case DATALINK_ARCNET:
bytes = arcnet_receive(
src, pdu, max_pdu, timeout);
break;
case DATALINK_ETHERNET:
bytes = ethernet_receive(
src, pdu, max_pdu, timeout);
break;
case DATALINK_BIP:
bytes = bip_receive(
src, pdu, max_pdu, timeout);
break;
case DATALINK_BIP6:
bytes = bip6_receive(
src, pdu, max_pdu, timeout);
break;
case DATALINK_MSTP:
bytes = dlmstp_receive(
src, pdu, max_pdu, timeout);
break;
default:
break;
}
return bytes;
}
void datalink_cleanup(void)
{
switch (Datalink_Transport) {
case DATALINK_NONE:
break;
case DATALINK_ARCNET:
arcnet_cleanup();
break;
case DATALINK_ETHERNET:
ethernet_cleanup();
break;
case DATALINK_BIP:
bip_cleanup();
break;
case DATALINK_BIP6:
bip6_cleanup();
break;
case DATALINK_MSTP:
dlmstp_cleanup();
break;
default:
break;
}
}
void datalink_get_broadcast_address(BACNET_ADDRESS *dest)
{
switch (Datalink_Transport) {
case DATALINK_NONE:
break;
case DATALINK_ARCNET:
arcnet_get_broadcast_address(dest);
break;
case DATALINK_ETHERNET:
ethernet_get_broadcast_address(dest);
break;
case DATALINK_BIP:
bip_get_broadcast_address(dest);
break;
case DATALINK_BIP6:
bip6_get_broadcast_address(dest);
break;
case DATALINK_MSTP:
dlmstp_get_broadcast_address(dest);
break;
default:
break;
}
}
void datalink_get_my_address(BACNET_ADDRESS *my_address)
{
switch (Datalink_Transport) {
case DATALINK_NONE:
break;
case DATALINK_ARCNET:
arcnet_get_my_address(my_address);
break;
case DATALINK_ETHERNET:
ethernet_get_my_address(my_address);
break;
case DATALINK_BIP:
bip_get_my_address(my_address);
break;
case DATALINK_BIP6:
bip6_get_my_address(my_address);
break;
case DATALINK_MSTP:
dlmstp_get_my_address(my_address);
break;
default:
break;
}
}
void datalink_set_interface(char *ifname)
{
switch (Datalink_Transport) {
case DATALINK_NONE:
(void)ifname;
break;
case DATALINK_ARCNET:
(void)ifname;
break;
case DATALINK_ETHERNET:
(void)ifname;
break;
case DATALINK_BIP:
(void)ifname;
break;
case DATALINK_BIP6:
(void)ifname;
break;
case DATALINK_MSTP:
(void)ifname;
break;
default:
break;
}
}
void datalink_maintenance_timer(uint16_t seconds)
{
switch (Datalink_Transport) {
case DATALINK_NONE:
break;
case DATALINK_ARCNET:
break;
case DATALINK_ETHERNET:
break;
case DATALINK_BIP:
bvlc_maintenance_timer(seconds);
break;
case DATALINK_BIP6:
bvlc6_maintenance_timer(seconds);
break;
case DATALINK_MSTP:
break;
default:
break;
}
}
#endif
+6
View File
@@ -30,6 +30,7 @@
#if defined(BACDL_ETHERNET)
#include "bacnet/datalink/ethernet.h"
#define MAX_MPDU ETHERNET_MPDU_MAX
#define datalink_init ethernet_init
#define datalink_send_pdu ethernet_send_pdu
@@ -41,6 +42,7 @@
#elif defined(BACDL_ARCNET)
#include "bacnet/datalink/arcnet.h"
#define MAX_MPDU ARCNET_MPDU_MAX
#define datalink_init arcnet_init
#define datalink_send_pdu arcnet_send_pdu
@@ -52,6 +54,7 @@
#elif defined(BACDL_MSTP)
#include "bacnet/datalink/dlmstp.h"
#define MAX_MPDU DLMSTP_MPDU_MAX
#define datalink_init dlmstp_init
#define datalink_send_pdu dlmstp_send_pdu
@@ -65,6 +68,7 @@
#include "bacnet/datalink/bip.h"
#include "bacnet/datalink/bvlc.h"
#include "bacnet/basic/bbmd/h_bbmd.h"
#define MAX_MPDU BIP_MPDU_MAX
#define datalink_init bip_init
#define datalink_send_pdu bip_send_pdu
@@ -85,6 +89,8 @@ void routed_get_my_address(
#include "bacnet/datalink/bip6.h"
#include "bacnet/datalink/bvlc6.h"
#include "bacnet/basic/bbmd6/h_bbmd6.h"
#define MAX_MPDU BIP6_MPDU_MAX
#define datalink_init bip6_init
#define datalink_send_pdu bip6_send_pdu
#define datalink_receive bip6_receive
+5 -5
View File
@@ -33,15 +33,15 @@
/* defines specific to MS/TP */
/* preamble+type+dest+src+len+crc8+crc16 */
#define MAX_HEADER (2+1+1+1+2+1+2)
#define MAX_MPDU (MAX_HEADER+MAX_PDU)
#define DLMSTP_HEADER_MAX (2+1+1+1+2+1+2)
#define DLMSTP_MPDU_MAX (DLMSTP_HEADER_MAX+MAX_PDU)
typedef struct dlmstp_packet {
bool ready; /* true if ready to be sent or received */
BACNET_ADDRESS address; /* source address */
uint8_t frame_type; /* type of message */
uint16_t pdu_len; /* packet length */
uint8_t pdu[MAX_MPDU]; /* packet */
uint8_t pdu[DLMSTP_MPDU_MAX]; /* packet */
} DLMSTP_PACKET;
#ifdef __cplusplus
@@ -135,12 +135,12 @@ extern "C" {
bool dlmstp_send_pdu_queue_empty(void);
BACNET_STACK_EXPORT
bool dlmstp_send_pdu_queue_full(void);
BACNET_STACK_EXPORT
uint8_t dlmstp_max_info_frames_limit(void);
BACNET_STACK_EXPORT
uint8_t dlmstp_max_master_limit(void);
#ifdef __cplusplus
}
+2 -2
View File
@@ -32,8 +32,8 @@
#include "bacnet/npdu.h"
/* specific defines for Ethernet */
#define MAX_HEADER (6+6+2+1+1+1)
#define MAX_MPDU (MAX_HEADER+MAX_PDU)
#define ETHERNET_HEADER_MAX (6+6+2+1+1+1)
#define ETHERNET_MPDU_MAX (ETHERNET_HEADER_MAX+MAX_PDU)
#ifdef __cplusplus
extern "C" {