diff --git a/bacnet-stack/ports/at91sam7s/irq.c b/bacnet-stack/ports/at91sam7s/irq.c
new file mode 100644
index 00000000..23086057
--- /dev/null
+++ b/bacnet-stack/ports/at91sam7s/irq.c
@@ -0,0 +1,29 @@
+// The following functions must be written in ARM mode
+// these functions are called directly by an exception vector
+
+//------------------------------------------------------------------------------
+// Internal functions
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+/// Default spurious interrupt handler. Infinite loop.
+//------------------------------------------------------------------------------
+void AT91F_Spurious_handler( void )
+{
+ while (1);
+}
+
+//------------------------------------------------------------------------------
+/// Default handler for fast interrupt requests. Infinite loop.
+//------------------------------------------------------------------------------
+void AT91F_Default_FIQ_handler( void )
+{
+ while (1);
+}
+
+//------------------------------------------------------------------------------
+/// Default handler for standard interrupt requests. Infinite loop.
+//------------------------------------------------------------------------------
+void AT91F_Default_IRQ_handler( void )
+{
+ while (1);
+}
diff --git a/bacnet-stack/ports/atmega168/bacnet.ewp b/bacnet-stack/ports/atmega168/bacnet.ewp
index 15daa734..dc6beebe 100644
--- a/bacnet-stack/ports/atmega168/bacnet.ewp
+++ b/bacnet-stack/ports/atmega168/bacnet.ewp
@@ -1985,9 +1985,66 @@
-
- $PROJ_DIR$\..\..\src\abort.c
-
+
+ BACnet-Core
+
+ $PROJ_DIR$\..\..\src\abort.c
+
+
+ $PROJ_DIR$\..\..\src\bacapp.c
+
+
+ $PROJ_DIR$\..\..\src\bacdcode.c
+
+
+ $PROJ_DIR$\..\..\src\bacerror.c
+
+
+ $PROJ_DIR$\..\..\src\bacint.c
+
+
+ $PROJ_DIR$\..\..\src\bacreal.c
+
+
+ $PROJ_DIR$\..\..\src\bacstr.c
+
+
+ $PROJ_DIR$\..\..\src\crc.c
+
+
+ $PROJ_DIR$\..\..\src\iam.c
+
+
+ $PROJ_DIR$\..\..\src\npdu.c
+
+
+ $PROJ_DIR$\..\..\src\reject.c
+
+
+ $PROJ_DIR$\..\..\src\rp.c
+
+
+ $PROJ_DIR$\..\..\src\whois.c
+
+
+ $PROJ_DIR$\..\..\src\wp.c
+
+
+
+ BACnet-Handlers
+
+ $PROJ_DIR$\..\..\demo\handler\h_npdu.c
+
+
+ $PROJ_DIR$\..\..\demo\handler\noserv.c
+
+
+ $PROJ_DIR$\..\..\demo\handler\s_iam.c
+
+
+ $PROJ_DIR$\..\..\demo\handler\txbuf.c
+
+
$PROJ_DIR$\apdu.c
@@ -1997,39 +2054,15 @@
$PROJ_DIR$\avr035.h
-
- $PROJ_DIR$\..\..\src\bacapp.c
-
-
- $PROJ_DIR$\..\..\src\bacdcode.c
-
-
- $PROJ_DIR$\..\..\src\bacerror.c
-
-
- $PROJ_DIR$\..\..\src\bacint.c
-
-
- $PROJ_DIR$\..\..\src\bacreal.c
-
-
- $PROJ_DIR$\..\..\src\bacstr.c
-
$PROJ_DIR$\bv.c
-
- $PROJ_DIR$\..\..\src\crc.c
-
$PROJ_DIR$\device.c
$PROJ_DIR$\dlmstp.c
-
- $PROJ_DIR$\..\..\demo\handler\h_npdu.c
-
$PROJ_DIR$\h_rp.c
@@ -2042,36 +2075,18 @@
$PROJ_DIR$\hardware.h
-
- $PROJ_DIR$\..\..\src\iam.c
-
$PROJ_DIR$\iar2gcc.h
$PROJ_DIR$\main.c
-
- $PROJ_DIR$\..\..\demo\handler\noserv.c
-
-
- $PROJ_DIR$\..\..\src\npdu.c
-
-
- $PROJ_DIR$\..\..\src\reject.c
-
-
- $PROJ_DIR$\..\..\src\rp.c
-
$PROJ_DIR$\rs485.c
$PROJ_DIR$\rs485.h
-
- $PROJ_DIR$\..\..\demo\handler\s_iam.c
-
$PROJ_DIR$\stack.c
@@ -2081,15 +2096,6 @@
$PROJ_DIR$\timer.h
-
- $PROJ_DIR$\..\..\demo\handler\txbuf.c
-
-
- $PROJ_DIR$\..\..\src\whois.c
-
-
- $PROJ_DIR$\..\..\src\wp.c
-
diff --git a/bacnet-stack/ports/atmega8/Makefile b/bacnet-stack/ports/atmega8/Makefile
index 073a8e39..2d41c583 100644
--- a/bacnet-stack/ports/atmega8/Makefile
+++ b/bacnet-stack/ports/atmega8/Makefile
@@ -19,34 +19,35 @@ BACNET_INCLUDE = ../../include
BACNET_DEMO = ../../demo
# local files for this project
-CSRC = main.c \
- timer.c \
- rs485.c \
+CSRC = apdu.c \
+ device.c \
dlmstp.c \
- apdu.c \
- $(BACNET_CORE)/crc.c
+ main.c \
+ rs485.c \
+ timer.c
# common demo files needed
-DEMOSRC = h_rp.c \
- device.c \
+DEMOSRC =
+ $(BACNET_DEMO)/handler/h_rp.c \
$(BACNET_DEMO)/handler/txbuf.c \
$(BACNET_DEMO)/handler/h_npdu.c \
$(BACNET_DEMO)/handler/noserv.c
-# core BACnet stack files
+# core BACnet stack files - place into library
CORESRC = \
+ $(BACNET_CORE)/crc.c \
+ $(BACNET_CORE)/abort.c \
$(BACNET_CORE)/apdu.c \
- $(BACNET_CORE)/npdu.c \
+ $(BACNET_CORE)/bacapp.c \
$(BACNET_CORE)/bacdcode.c \
+ $(BACNET_CORE)/bacerror.c \
$(BACNET_CORE)/bacint.c \
$(BACNET_CORE)/bacreal.c \
$(BACNET_CORE)/bacstr.c \
- $(BACNET_CORE)/rp.c \
$(BACNET_CORE)/bacaddr.c \
- $(BACNET_CORE)/abort.c \
+ $(BACNET_CORE)/npdu.c \
$(BACNET_CORE)/reject.c \
- $(BACNET_CORE)/bacerror.c \
- $(BACNET_CORE)/bacapp.c
+ $(BACNET_CORE)/rp.c
# $(BACNET_CORE)/iam.c \
# $(BACNET_CORE)/whois.c \
diff --git a/bacnet-stack/ports/atmega8/ai.c b/bacnet-stack/ports/atmega8/ai.c
deleted file mode 100644
index 848482ef..00000000
--- a/bacnet-stack/ports/atmega8/ai.c
+++ /dev/null
@@ -1,163 +0,0 @@
-/**************************************************************************
-*
-* Copyright (C) 2005 Steve Karg
-*
-* Permission is hereby granted, free of charge, to any person obtaining
-* a copy of this software and associated documentation files (the
-* "Software"), to deal in the Software without restriction, including
-* without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to
-* permit persons to whom the Software is furnished to do so, subject to
-* the following conditions:
-*
-* The above copyright notice and this permission notice shall be included
-* in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*
-*********************************************************************/
-
-/* Analog Input Objects customize for your use */
-
-#include
-#include
-#include
-#include "bacdef.h"
-#include "bacdcode.h"
-#include "bacenum.h"
-#include "config.h"
-
-/* Analog Input = Photocell */
-#define MAX_ANALOG_INPUTS 9
-#if (MAX_ANALOG_INPUTS > 9)
-#error Modify the Analog_Input_Name to handle multiple digits
-#endif
-
-float Present_Value[MAX_ANALOG_INPUTS];
-
-/* 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)
- return true;
-
- return false;
-}
-
-/* we simply have 0-n object instances. */
-unsigned Analog_Input_Count(
- void)
-{
- return MAX_ANALOG_INPUTS;
-}
-
-/* we simply have 0-n object instances. */
-uint32_t Analog_Input_Index_To_Instance(
- unsigned index)
-{
- return index;
-}
-
-/* we simply have 0-n object instances. */
-unsigned Analog_Input_Instance_To_Index(
- uint32_t object_instance)
-{
- return object_instance;
-}
-
-
-char *Analog_Input_Name(
- uint32_t object_instance)
-{
- static char text_string[5] = "AI-0"; /* okay for single thread */
-
- if (object_instance < MAX_ANALOG_INPUTS) {
- text_string[3] = '0' + (uint8_t) object_instance;
- return text_string;
- }
-
- return NULL;
-}
-
-/* return apdu length, or -1 on error */
-/* assumption - object has already exists */
-int Analog_Input_Encode_Property_APDU(
- uint8_t * apdu,
- uint32_t object_instance,
- BACNET_PROPERTY_ID property,
- uint32_t array_index,
- BACNET_ERROR_CLASS * error_class,
- BACNET_ERROR_CODE * error_code)
-{
- int apdu_len = 0; /* return value */
- BACNET_BIT_STRING bit_string;
- BACNET_CHARACTER_STRING char_string;
- unsigned object_index;
-
- switch (property) {
- case PROP_OBJECT_IDENTIFIER:
- apdu_len =
- encode_application_object_id(&apdu[0], OBJECT_ANALOG_INPUT,
- object_instance);
- break;
- /* note: Name and Description don't have to be the same.
- You could make Description writable and different.
- Note that Object-Name must be unique in this device */
- case PROP_OBJECT_NAME:
- case PROP_DESCRIPTION:
- characterstring_init_ansi(&char_string,
- Analog_Input_Name(object_instance));
- apdu_len =
- encode_application_character_string(&apdu[0], &char_string);
- break;
- case PROP_OBJECT_TYPE:
- apdu_len =
- encode_application_enumerated(&apdu[0], OBJECT_ANALOG_INPUT);
- break;
- case PROP_PRESENT_VALUE:
- object_index = Analog_Input_Instance_To_Index(object_instance);
- apdu_len =
- encode_application_real(&apdu[0], Present_Value[object_index]);
- break;
- case PROP_STATUS_FLAGS:
- bitstring_init(&bit_string);
- bitstring_set_bit(&bit_string, STATUS_FLAG_IN_ALARM, false);
- bitstring_set_bit(&bit_string, STATUS_FLAG_FAULT, false);
- bitstring_set_bit(&bit_string, STATUS_FLAG_OVERRIDDEN, false);
- bitstring_set_bit(&bit_string, STATUS_FLAG_OUT_OF_SERVICE, false);
- apdu_len = encode_application_bitstring(&apdu[0], &bit_string);
- break;
- case PROP_EVENT_STATE:
- apdu_len =
- encode_application_enumerated(&apdu[0], EVENT_STATE_NORMAL);
- break;
- case PROP_OUT_OF_SERVICE:
- apdu_len = encode_application_boolean(&apdu[0], false);
- break;
- case PROP_UNITS:
- apdu_len = encode_application_enumerated(&apdu[0], UNITS_PERCENT);
- break;
- default:
- *error_class = ERROR_CLASS_PROPERTY;
- *error_code = ERROR_CODE_UNKNOWN_PROPERTY;
- apdu_len = -1;
- break;
- }
- /* only array properties can have array options */
- if ((apdu_len >= 0) && (array_index != BACNET_ARRAY_ALL)) {
- *error_class = ERROR_CLASS_PROPERTY;
- *error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY;
- apdu_len = -1;
- }
-
- return apdu_len;
-}
diff --git a/bacnet-stack/ports/atmega8/av.c b/bacnet-stack/ports/atmega8/av.c
deleted file mode 100644
index ef0a97c0..00000000
--- a/bacnet-stack/ports/atmega8/av.c
+++ /dev/null
@@ -1,264 +0,0 @@
-/**************************************************************************
-*
-* Copyright (C) 2006 Steve Karg
-*
-* Permission is hereby granted, free of charge, to any person obtaining
-* a copy of this software and associated documentation files (the
-* "Software"), to deal in the Software without restriction, including
-* without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to
-* permit persons to whom the Software is furnished to do so, subject to
-* the following conditions:
-*
-* The above copyright notice and this permission notice shall be included
-* in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*
-*********************************************************************/
-
-/* Analog Value Objects - customize for your use */
-
-#include
-#include
-#include "hardware.h"
-#include "bacdef.h"
-#include "bacdcode.h"
-#include "bacenum.h"
-#include "bacapp.h"
-#include "config.h" /* the custom stuff */
-#include "wp.h"
-#include "av.h"
-
-#if (MAX_ANALOG_VALUES > 10)
-#error Modify the Analog_Value_Name to handle multiple digits
-#endif
-
-float AV_Present_Value[MAX_ANALOG_VALUES];
-
-/* we simply have 0-n object instances. Yours might be */
-/* more complex, and then you need validate that the */
-/* given instance exists */
-bool Analog_Value_Valid_Instance(
- uint32_t object_instance)
-{
- if (object_instance < MAX_ANALOG_VALUES)
- return true;
-
- return false;
-}
-
-/* we simply have 0-n object instances. Yours might be */
-/* more complex, and then count how many you have */
-unsigned Analog_Value_Count(
- void)
-{
- return MAX_ANALOG_VALUES;
-}
-
-/* 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_Value_Index_To_Instance(
- unsigned index)
-{
- 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 */
-unsigned Analog_Value_Instance_To_Index(
- uint32_t object_instance)
-{
- return object_instance;
-}
-
-/* note: the object name must be unique within this device */
-char *Analog_Value_Name(
- uint32_t object_instance)
-{
- static char text_string[5] = "AV-"; /* okay for single thread */
-
- text_string[3] = '0' + (uint8_t) object_instance;
-
- return text_string;
-}
-
-/* return apdu len, or -1 on error */
-int Analog_Value_Encode_Property_APDU(
- uint8_t * apdu,
- uint32_t object_instance,
- BACNET_PROPERTY_ID property,
- uint32_t array_index,
- BACNET_ERROR_CLASS * error_class,
- BACNET_ERROR_CODE * error_code)
-{
- int apdu_len = 0; /* return value */
- BACNET_BIT_STRING bit_string;
- BACNET_CHARACTER_STRING char_string;
- unsigned object_index;
-
- switch (property) {
- case PROP_OBJECT_IDENTIFIER:
- apdu_len =
- encode_application_object_id(&apdu[0], OBJECT_ANALOG_VALUE,
- object_instance);
- break;
- case PROP_OBJECT_NAME:
- characterstring_init_ansi(&char_string,
- Analog_Value_Name(object_instance));
- apdu_len =
- encode_application_character_string(&apdu[0], &char_string);
- break;
- case PROP_OBJECT_TYPE:
- apdu_len =
- encode_application_enumerated(&apdu[0], OBJECT_ANALOG_VALUE);
- break;
- case PROP_PRESENT_VALUE:
- object_index = Analog_Value_Instance_To_Index(object_instance);
- apdu_len =
- encode_application_real(&apdu[0],
- AV_Present_Value[object_index]);
- break;
- case PROP_STATUS_FLAGS:
- bitstring_init(&bit_string);
- bitstring_set_bit(&bit_string, STATUS_FLAG_IN_ALARM, false);
- bitstring_set_bit(&bit_string, STATUS_FLAG_FAULT, false);
- bitstring_set_bit(&bit_string, STATUS_FLAG_OVERRIDDEN, false);
- bitstring_set_bit(&bit_string, STATUS_FLAG_OUT_OF_SERVICE, false);
- apdu_len = encode_application_bitstring(&apdu[0], &bit_string);
- break;
- case PROP_EVENT_STATE:
- apdu_len =
- encode_application_enumerated(&apdu[0], EVENT_STATE_NORMAL);
- break;
- case PROP_OUT_OF_SERVICE:
- apdu_len = encode_application_boolean(&apdu[0], false);
- break;
- case PROP_UNITS:
- apdu_len = encode_application_enumerated(&apdu[0], UNITS_PERCENT);
- break;
- default:
- *error_class = ERROR_CLASS_PROPERTY;
- *error_code = ERROR_CODE_UNKNOWN_PROPERTY;
- apdu_len = -1;
- break;
- }
- /* only array properties can have array options */
- if ((apdu_len >= 0) && (array_index != BACNET_ARRAY_ALL)) {
- *error_class = ERROR_CLASS_PROPERTY;
- *error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY;
- apdu_len = -1;
- }
-
- return apdu_len;
-}
-
-/* returns true if successful */
-bool Analog_Value_Write_Property(
- BACNET_WRITE_PROPERTY_DATA * wp_data,
- BACNET_ERROR_CLASS * error_class,
- BACNET_ERROR_CODE * error_code)
-{
- bool status = false; /* return value */
- unsigned int object_index = 0;
- int len = 0;
- BACNET_APPLICATION_DATA_VALUE value;
-
- if (!Analog_Value_Valid_Instance(wp_data->object_instance)) {
- *error_class = ERROR_CLASS_OBJECT;
- *error_code = ERROR_CODE_UNKNOWN_OBJECT;
- return false;
- }
- /* decode the some of the request */
- len =
- bacapp_decode_application_data(wp_data->application_data,
- wp_data->application_data_len, &value);
- /* FIXME: len < application_data_len: more data? */
- if (len < 0) {
- /* error while decoding - a value larger than we can handle */
- wp_data->error_class = ERROR_CLASS_PROPERTY;
- wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
- return false;
- }
- switch (wp_data->object_property) {
- case PROP_PRESENT_VALUE:
- if (value.tag == BACNET_APPLICATION_TAG_REAL) {
- object_index =
- Analog_Value_Instance_To_Index(wp_data->object_instance);
- AV_Present_Value[object_index] = value.type.Real;
- status = true;
- } else {
- *error_class = ERROR_CLASS_PROPERTY;
- *error_code = ERROR_CODE_INVALID_DATA_TYPE;
- }
- break;
- default:
- *error_class = ERROR_CLASS_PROPERTY;
- *error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
- break;
- }
-
- return status;
-}
-
-#ifdef TEST
-#include
-#include
-#include "ctest.h"
-
-void testAnalog_Value(
- Test * pTest)
-{
- uint8_t apdu[MAX_APDU] = { 0 };
- int len = 0;
- uint32_t len_value = 0;
- uint8_t tag_number = 0;
- BACNET_OBJECT_TYPE decoded_type = OBJECT_ANALOG_VALUE;
- uint32_t decoded_instance = 0;
- uint32_t instance = 123;
- BACNET_ERROR_CLASS error_class;
- BACNET_ERROR_CODE error_code;
-
- len =
- Analog_Value_Encode_Property_APDU(&apdu[0], instance,
- PROP_OBJECT_IDENTIFIER, BACNET_ARRAY_ALL, &error_class, &error_code);
- ct_test(pTest, len != 0);
- len = decode_tag_number_and_value(&apdu[0], &tag_number, &len_value);
- ct_test(pTest, tag_number == BACNET_APPLICATION_TAG_OBJECT_ID);
- len =
- decode_object_id(&apdu[len], (int *) &decoded_type, &decoded_instance);
- ct_test(pTest, decoded_type == OBJECT_ANALOG_VALUE);
- ct_test(pTest, decoded_instance == instance);
-
- return;
-}
-
-#ifdef TEST_ANALOG_VALUE
-int main(
- void)
-{
- Test *pTest;
- bool rc;
-
- pTest = ct_create("BACnet Analog Value", NULL);
- /* individual tests */
- rc = ct_addTestFunction(pTest, testAnalog_Value);
- assert(rc);
-
- ct_setStream(pTest, stdout);
- ct_run(pTest);
- (void) ct_report(pTest);
- ct_destroy(pTest);
-
- return 0;
-}
-#endif /* TEST_ANALOG_VALUE */
-#endif /* TEST */
diff --git a/bacnet-stack/ports/atmega8/bacnet.ewp b/bacnet-stack/ports/atmega8/bacnet.ewp
new file mode 100644
index 00000000..a3c8f780
--- /dev/null
+++ b/bacnet-stack/ports/atmega8/bacnet.ewp
@@ -0,0 +1,2066 @@
+
+
+
+ 2
+
+ Debug
+
+ AVR
+
+ 1
+
+ General
+ 10
+
+ 8
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ICCAVR
+ 5
+
+ 14
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AAVR
+ 4
+
+ 10
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CUSTOM
+ 3
+
+
+
+
+
+
+ BICOMP
+ 0
+
+
+
+ BUILDACTION
+ 1
+
+
+
+
+
+
+ XLINK
+ 2
+
+ 13
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ XAR
+ 2
+
+ 0
+ 1
+ 1
+
+
+
+
+
+
+ BILINK
+ 0
+
+
+
+
+ Release
+
+ AVR
+
+ 0
+
+ General
+ 10
+
+ 8
+ 1
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ICCAVR
+ 5
+
+ 14
+ 1
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AAVR
+ 4
+
+ 10
+ 1
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CUSTOM
+ 3
+
+
+
+
+
+
+ BICOMP
+ 0
+
+
+
+ BUILDACTION
+ 1
+
+
+
+
+
+
+ XLINK
+ 2
+
+ 13
+ 1
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ XAR
+ 2
+
+ 0
+ 1
+ 0
+
+
+
+
+
+
+ BILINK
+ 0
+
+
+
+
+ BACnet-Core
+
+ $PROJ_DIR$\..\..\src\abort.c
+
+
+ $PROJ_DIR$\..\..\src\bacapp.c
+
+
+ $PROJ_DIR$\..\..\src\bacdcode.c
+
+
+ $PROJ_DIR$\..\..\src\bacerror.c
+
+
+ $PROJ_DIR$\..\..\src\bacint.c
+
+
+ $PROJ_DIR$\..\..\src\bacreal.c
+
+
+ $PROJ_DIR$\..\..\src\bacstr.c
+
+
+ $PROJ_DIR$\..\..\src\crc.c
+
+
+ $PROJ_DIR$\..\..\src\iam.c
+
+
+ $PROJ_DIR$\..\..\src\npdu.c
+
+
+ $PROJ_DIR$\..\..\src\reject.c
+
+
+ $PROJ_DIR$\..\..\src\rp.c
+
+
+ $PROJ_DIR$\..\..\src\whois.c
+
+
+
+ BACnet-Handlers
+
+ $PROJ_DIR$\..\..\demo\handler\h_npdu.c
+
+
+ $PROJ_DIR$\..\..\demo\handler\h_rp.c
+
+
+ $PROJ_DIR$\..\..\demo\handler\noserv.c
+
+
+ $PROJ_DIR$\..\..\demo\handler\txbuf.c
+
+
+
+ $PROJ_DIR$\apdu.c
+
+
+ $PROJ_DIR$\device.c
+
+
+ $PROJ_DIR$\dlmstp.c
+
+
+ $PROJ_DIR$\main.c
+
+
+ $PROJ_DIR$\rs485.c
+
+
+ $PROJ_DIR$\timer.c
+
+
+
+
diff --git a/bacnet-stack/ports/atmega8/bacnet.eww b/bacnet-stack/ports/atmega8/bacnet.eww
new file mode 100644
index 00000000..7a4cd894
--- /dev/null
+++ b/bacnet-stack/ports/atmega8/bacnet.eww
@@ -0,0 +1,10 @@
+
+
+
+
+ $WS_DIR$\bacnet.ewp
+
+
+
+
+
diff --git a/bacnet-stack/ports/atmega8/bv.c b/bacnet-stack/ports/atmega8/bv.c
deleted file mode 100644
index 48510722..00000000
--- a/bacnet-stack/ports/atmega8/bv.c
+++ /dev/null
@@ -1,313 +0,0 @@
-/**************************************************************************
-*
-* Copyright (C) 2006 Steve Karg
-*
-* Permission is hereby granted, free of charge, to any person obtaining
-* a copy of this software and associated documentation files (the
-* "Software"), to deal in the Software without restriction, including
-* without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to
-* permit persons to whom the Software is furnished to do so, subject to
-* the following conditions:
-*
-* The above copyright notice and this permission notice shall be included
-* in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*
-*********************************************************************/
-
-/* Binary Value Objects - customize for your use */
-
-#include
-#include
-#include
-#include "hardware.h"
-#include "bacdef.h"
-#include "bacdcode.h"
-#include "bacenum.h"
-#include "config.h" /* the custom stuff */
-#include "wp.h"
-#include "bv.h"
-
-#if (MAX_BINARY_VALUES > 10)
-#error Modify the Binary_Value_Name to handle multiple digits
-#endif
-
-static BACNET_BINARY_PV Present_Value[MAX_BINARY_VALUES];
-
-/* we simply have 0-n object instances. */
-bool Binary_Value_Valid_Instance(
- uint32_t object_instance)
-{
- if (object_instance < MAX_BINARY_VALUES)
- return true;
-
- return false;
-}
-
-/* we simply have 0-n object instances. */
-unsigned Binary_Value_Count(
- void)
-{
- return MAX_BINARY_VALUES;
-}
-
-/* we simply have 0-n object instances. */
-uint32_t Binary_Value_Index_To_Instance(
- unsigned index)
-{
- return index;
-}
-
-/* we simply have 0-n object instances. */
-unsigned Binary_Value_Instance_To_Index(
- uint32_t object_instance)
-{
- unsigned index = MAX_BINARY_VALUES;
-
- if (object_instance < MAX_BINARY_VALUES)
- index = object_instance;
-
- return index;
-}
-
-static BACNET_BINARY_PV Binary_Value_Present_Value(
- uint32_t object_instance)
-{
- BACNET_BINARY_PV value = BINARY_INACTIVE;
-
- if (object_instance < MAX_BINARY_VALUES) {
- value = Present_Value[object_instance];
- }
-
- return value;
-}
-
-/* note: the object name must be unique within this device */
-char *Binary_Value_Name(
- uint32_t object_instance)
-{
- static char text_string[5] = "BV-0"; /* okay for single thread */
-
- if (object_instance < MAX_BINARY_VALUES) {
- text_string[3] = '0' + (uint8_t) object_instance;
- return text_string;
- }
-
- return NULL;
-}
-
-/* return apdu len, or -1 on error */
-int Binary_Value_Encode_Property_APDU(
- uint8_t * apdu,
- uint32_t object_instance,
- BACNET_PROPERTY_ID property,
- uint32_t array_index,
- BACNET_ERROR_CLASS * error_class,
- BACNET_ERROR_CODE * error_code)
-{
- int apdu_len = 0; /* return value */
- BACNET_BIT_STRING bit_string;
- BACNET_CHARACTER_STRING char_string;
- BACNET_BINARY_PV present_value = BINARY_INACTIVE;
- BACNET_POLARITY polarity = POLARITY_NORMAL;
-
- switch (property) {
- case PROP_OBJECT_IDENTIFIER:
- apdu_len =
- encode_application_object_id(&apdu[0], OBJECT_BINARY_VALUE,
- object_instance);
- break;
- /* note: Name and Description don't have to be the same.
- You could make Description writable and different */
- case PROP_OBJECT_NAME:
- characterstring_init_ansi(&char_string,
- Binary_Value_Name(object_instance));
- apdu_len =
- encode_application_character_string(&apdu[0], &char_string);
- break;
- case PROP_OBJECT_TYPE:
- apdu_len =
- encode_application_enumerated(&apdu[0], OBJECT_BINARY_VALUE);
- break;
- case PROP_PRESENT_VALUE:
- present_value = Binary_Value_Present_Value(object_instance);
- apdu_len = encode_application_enumerated(&apdu[0], present_value);
- break;
- case PROP_STATUS_FLAGS:
- /* note: see the details in the standard on how to use these */
- bitstring_init(&bit_string);
- bitstring_set_bit(&bit_string, STATUS_FLAG_IN_ALARM, false);
- bitstring_set_bit(&bit_string, STATUS_FLAG_FAULT, false);
- bitstring_set_bit(&bit_string, STATUS_FLAG_OVERRIDDEN, false);
- bitstring_set_bit(&bit_string, STATUS_FLAG_OUT_OF_SERVICE, false);
- apdu_len = encode_application_bitstring(&apdu[0], &bit_string);
- break;
- case PROP_EVENT_STATE:
- /* note: see the details in the standard on how to use this */
- apdu_len =
- encode_application_enumerated(&apdu[0], EVENT_STATE_NORMAL);
- break;
- case PROP_OUT_OF_SERVICE:
- apdu_len = encode_application_boolean(&apdu[0], false);
- break;
- case PROP_POLARITY:
- /* FIXME: figure out the polarity */
- apdu_len = encode_application_enumerated(&apdu[0], polarity);
- break;
- default:
- *error_class = ERROR_CLASS_PROPERTY;
- *error_code = ERROR_CODE_UNKNOWN_PROPERTY;
- apdu_len = -1;
- break;
- }
- /* only array properties can have array options */
- if ((apdu_len >= 0) && (array_index != BACNET_ARRAY_ALL)) {
- *error_class = ERROR_CLASS_PROPERTY;
- *error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY;
- apdu_len = -1;
- }
-
- return apdu_len;
-}
-
-/* returns true if successful */
-bool Binary_Value_Write_Property(
- BACNET_WRITE_PROPERTY_DATA * wp_data,
- BACNET_ERROR_CLASS * error_class,
- BACNET_ERROR_CODE * error_code)
-{
- bool status = false; /* return value */
- unsigned int object_index = 0;
- int len = 0;
- BACNET_APPLICATION_DATA_VALUE value;
-
- if (!Binary_Value_Valid_Instance(wp_data->object_instance)) {
- *error_class = ERROR_CLASS_OBJECT;
- *error_code = ERROR_CODE_UNKNOWN_OBJECT;
- return false;
- }
- /* decode the some of the request */
- len =
- bacapp_decode_application_data(wp_data->application_data,
- wp_data->application_data_len, &value);
- /* FIXME: len < application_data_len: more data? */
- if (len < 0) {
- /* error while decoding - a value larger than we can handle */
- wp_data->error_class = ERROR_CLASS_PROPERTY;
- wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
- return false;
- }
- switch (wp_data->object_property) {
- case PROP_PRESENT_VALUE:
- if (value.tag == BACNET_APPLICATION_TAG_ENUMERATED) {
- if ((value.type.Enumerated == BINARY_ACTIVE) ||
- (value.type.Enumerated == BINARY_INACTIVE)) {
- object_index =
- Binary_Value_Instance_To_Index
- (wp_data->object_instance);
- /* NOTE: this Binary value has no priority array */
- Present_Value[object_index] =
- (BACNET_BINARY_PV) value.type.Enumerated;
- /* Note: you could set the physical output here if we
- are the highest priority.
- However, if Out of Service is TRUE, then don't set the
- physical output. */
- if (Present_Value[0] == BINARY_ACTIVE) {
- LED_GREEN_ON();
- } else {
- LED_GREEN_OFF();
- }
- status = true;
- } else {
- *error_class = ERROR_CLASS_PROPERTY;
- *error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
- }
- } else {
- *error_class = ERROR_CLASS_PROPERTY;
- *error_code = ERROR_CODE_INVALID_DATA_TYPE;
- }
- break;
-#if 0
- case PROP_OUT_OF_SERVICE:
- if (value.tag == BACNET_APPLICATION_TAG_BOOLEAN) {
- object_index =
- Binary_Value_Instance_To_Index(wp_data->object_instance);
- Binary_Value_Out_Of_Service[object_index] = value.type.Boolean;
- status = true;
- } else {
- *error_class = ERROR_CLASS_PROPERTY;
- *error_code = ERROR_CODE_INVALID_DATA_TYPE;
- }
- break;
-#endif
- default:
- *error_class = ERROR_CLASS_PROPERTY;
- *error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
- break;
- }
-
- return status;
-}
-
-#ifdef TEST
-#include
-#include
-#include "ctest.h"
-
-void testBinary_Value(
- Test * pTest)
-{
- uint8_t apdu[MAX_APDU] = { 0 };
- int len = 0;
- uint32_t len_value = 0;
- uint8_t tag_number = 0;
- BACNET_OBJECT_TYPE decoded_type = OBJECT_BINARY_VALUE;
- uint32_t decoded_instance = 0;
- uint32_t instance = 123;
- BACNET_ERROR_CLASS error_class;
- BACNET_ERROR_CODE error_code;
-
-
- len =
- Binary_Value_Encode_Property_APDU(&apdu[0], instance,
- PROP_OBJECT_IDENTIFIER, BACNET_ARRAY_ALL, &error_class, &error_code);
- ct_test(pTest, len != 0);
- len = decode_tag_number_and_value(&apdu[0], &tag_number, &len_value);
- ct_test(pTest, tag_number == BACNET_APPLICATION_TAG_OBJECT_ID);
- len =
- decode_object_id(&apdu[len], (int *) &decoded_type, &decoded_instance);
- ct_test(pTest, decoded_type == OBJECT_BINARY_VALUE);
- ct_test(pTest, decoded_instance == instance);
-
- return;
-}
-
-#ifdef TEST_BINARY_VALUE
-int main(
- void)
-{
- Test *pTest;
- bool rc;
-
- pTest = ct_create("BACnet Binary_Value", NULL);
- /* individual tests */
- rc = ct_addTestFunction(pTest, testBinary_Value);
- assert(rc);
-
- ct_setStream(pTest, stdout);
- ct_run(pTest);
- (void) ct_report(pTest);
- ct_destroy(pTest);
-
- return 0;
-}
-#endif /* TEST_BINARY_VALUE */
-#endif /* TEST */
diff --git a/bacnet-stack/ports/atmega8/device.c b/bacnet-stack/ports/atmega8/device.c
index a3281650..bcb02abe 100644
--- a/bacnet-stack/ports/atmega8/device.c
+++ b/bacnet-stack/ports/atmega8/device.c
@@ -169,13 +169,8 @@ bool Device_Object_List_Identifier(
}
/* return the length of the apdu encoded or -1 for error */
-int Device_Encode_Property_APDU(
- uint8_t * apdu,
- uint32_t object_instance,
- BACNET_PROPERTY_ID property,
- uint32_t array_index,
- BACNET_ERROR_CLASS * error_class,
- BACNET_ERROR_CODE * error_code)
+int Device_Read_Property(
+ BACNET_READ_PROPERTY_DATA * rpdata)
{
int apdu_len = 0; /* return value */
int len = 0; /* apdu len intermediate value */
@@ -185,14 +180,19 @@ int Device_Encode_Property_APDU(
int object_type = 0;
uint32_t instance = 0;
unsigned count = 0;
+ uint8_t *apdu = NULL;
- object_instance = object_instance;
+ if ((rpdata->application_data == NULL) ||
+ (rpdata->application_data_len == 0)) {
+ return 0;
+ }
+ apdu = rpdata->application_data;
/* FIXME: change the hardcoded names to suit your application */
- switch (property) {
+ switch ((int) rpdata->object_property) {
case PROP_OBJECT_IDENTIFIER:
apdu_len =
- encode_application_object_id(&apdu[0], OBJECT_DEVICE,
- Object_Instance_Number);
+ encode_application_object_id(&apdu[0], rpdata->object_type,
+ rpdata->object_instance);
break;
case PROP_OBJECT_NAME:
characterstring_init_ansi(&char_string, Object_Name);
@@ -271,13 +271,13 @@ int Device_Encode_Property_APDU(
case PROP_OBJECT_LIST:
count = Device_Object_List_Count();
/* Array element zero is the number of objects in the list */
- if (array_index == 0)
+ if (rpdata->array_index == 0)
apdu_len = encode_application_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. */
- else if (array_index == BACNET_ARRAY_ALL) {
+ else if (rpdata->array_index == BACNET_ARRAY_ALL) {
for (i = 1; i <= count; i++) {
Device_Object_List_Identifier(i, &object_type, &instance);
len =
@@ -287,21 +287,22 @@ int Device_Encode_Property_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_code =
+ rpdata->error_code =
ERROR_CODE_ABORT_SEGMENTATION_NOT_SUPPORTED;
apdu_len = BACNET_STATUS_ABORT;
break;
}
}
} else {
- if (Device_Object_List_Identifier(array_index, &object_type,
+ if (Device_Object_List_Identifier(rpdata->array_index,
+ &object_type,
&instance))
apdu_len =
encode_application_object_id(&apdu[0], object_type,
instance);
else {
- *error_class = ERROR_CLASS_PROPERTY;
- *error_code = ERROR_CODE_INVALID_ARRAY_INDEX;
+ rpdata->error_class = ERROR_CLASS_PROPERTY;
+ rpdata->error_code = ERROR_CODE_INVALID_ARRAY_INDEX;
apdu_len = BACNET_STATUS_ERROR;
}
}
@@ -326,16 +327,16 @@ int Device_Encode_Property_APDU(
apdu_len = encode_application_unsigned(&apdu[0], 0);
break;
default:
- *error_class = ERROR_CLASS_PROPERTY;
- *error_code = ERROR_CODE_UNKNOWN_PROPERTY;
+ rpdata->error_class = ERROR_CLASS_PROPERTY;
+ rpdata->error_code = ERROR_CODE_UNKNOWN_PROPERTY;
apdu_len = -1;
break;
}
/* only array properties can have array options */
- if ((apdu_len >= 0) && (property != PROP_OBJECT_LIST) &&
- (array_index != BACNET_ARRAY_ALL)) {
- *error_class = ERROR_CLASS_PROPERTY;
- *error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY;
+ if ((apdu_len >= 0) && (rpdata->object_property != PROP_OBJECT_LIST) &&
+ (rpdata->array_index != BACNET_ARRAY_ALL)) {
+ rpdata->error_class = ERROR_CLASS_PROPERTY;
+ rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY;
apdu_len = BACNET_STATUS_ERROR;
}
diff --git a/bacnet-stack/ports/atmega8/dlmstp.c b/bacnet-stack/ports/atmega8/dlmstp.c
index a9698b16..f8722ae0 100644
--- a/bacnet-stack/ports/atmega8/dlmstp.c
+++ b/bacnet-stack/ports/atmega8/dlmstp.c
@@ -37,6 +37,7 @@
#include
#include
#include "bacdef.h"
+#include "mstpdef.h"
#include "dlmstp.h"
#include "rs485.h"
#include "crc.h"
@@ -44,6 +45,8 @@
#include "bits.h"
#include "bytes.h"
#include "bacaddr.h"
+/* special optimization - I-Am response in this module */
+#include "client.h"
#include "txbuf.h"
/* This file has been customized for use with small microprocessors */
@@ -53,46 +56,16 @@
#include "hardware.h"
#include "timer.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. */
-/* Station addresses for master nodes can be 0-127. */
-/* Station addresses for slave nodes can be 127-254. */
-#define MSTP_BROADCAST_ADDRESS 255
-
-/* 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
-#define FRAME_TYPE_TEST_REQUEST 3
-#define FRAME_TYPE_TEST_RESPONSE 4
-#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. */
-#define FRAME_TYPE_PROPRIETARY_MIN 128
-#define FRAME_TYPE_PROPRIETARY_MAX 255
-
-/* receive FSM states */
-typedef enum {
- MSTP_RECEIVE_STATE_IDLE = 0,
- MSTP_RECEIVE_STATE_PREAMBLE = 1,
- MSTP_RECEIVE_STATE_HEADER = 2,
- MSTP_RECEIVE_STATE_DATA = 3
-} MSTP_RECEIVE_STATE;
-
/* The state of the Receive State Machine */
static MSTP_RECEIVE_STATE Receive_State;
static struct mstp_flag_t {
/* A Boolean flag set to TRUE by the Receive State Machine */
- /* if an invalid or valid frame is received. */
+ /* if an invalid frame is received. */
/* Set to FALSE by the main state machine. */
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. */
unsigned ReceivedValidFrame:1;
/* A Boolean flag set TRUE by the datalink transmit if a
frame is pending */
@@ -118,7 +91,7 @@ struct mstp_packet_info_t {
uint8_t buffer_len; /* buffer to put the data */
uint8_t index; /* index into receive buffer */
};
-static struct nitoo_packet_info_t MSTP_Receive_Packet;
+static struct mstp_packet_info_t MSTP_Receive_Packet;
/* Used to store the data length of a received frame. */
static uint16_t DataLength;
@@ -160,24 +133,11 @@ static uint8_t TransmitPacketDest;
/* const uint16_t Tframe_abort = 1 + ((1000 * 60) / 9600); */
#define Tframe_abort 30
-/* The maximum idle time a sending node may allow to elapse between octets */
-/* of a frame the node is transmitting: 20 bit times. */
-#define Tframe_gap 20
-
/* The maximum time a node may wait after reception of a frame that expects */
/* a reply before sending the first octet of a reply or Reply Postponed */
/* frame: 250 milliseconds. */
#define Treply_delay 250
-/* The width of the time slot within which a node may generate a token: */
-/* 10 milliseconds. */
-#define Tslot 10
-
-/* The maximum time a node may wait after reception of the token or */
-/* a Poll For Master frame before sending the first octet of a frame: */
-/* 15 milliseconds. */
-#define Tusage_delay 15
-
/* we need to be able to increment without rolling over */
#define INCREMENT_AND_LIMIT_UINT8(x) {if (x < 0xFF) x++;}
@@ -257,6 +217,7 @@ static void MSTP_Send_Frame(
crc8 = CRC_Calc_Header(buffer[3], crc8);
buffer[4] = source;
crc8 = CRC_Calc_Header(buffer[4], crc8);
+
buffer[5] = HI_BYTE(pdu_len);
crc8 = CRC_Calc_Header(buffer[5], crc8);
buffer[6] = LO_BYTE(pdu_len);
@@ -283,116 +244,6 @@ static void MSTP_Send_Frame(
RS485_Transmitter_Enable(false);
}
-#if 0
-/* return true if the packet is good. */
-/* note: buffer should include the CRC as the last byte */
-static bool crc_header_good(
- uint8_t * buffer,
- uint8_t len)
-{
- uint8_t i; /* loop counter */
- uint8_t crc8 = 0xFF; /* loop counter */
-
- for (i = 0; i < len; i++) {
- crc8 = CRC_Calc_Header(buffer[i], crc8);
- }
-
- return (crc8 == 0x55);
-}
-
-
-static void mstp_receive_handler(
- void)
-{
- uint8_t data_register = 0; /* data from UART */
-
- if (RS485_ReceiveError()) {
- timer_silence_reset();
- } else if (RS485_DataAvailable(&data_register)) {
- timer_silence_reset();
- if ((MSTP_Receive_Packet.preamble1 == false) &&
- (data_register == 0x55)) {
- MSTP_Receive_Packet.preamble1 = true;
- return;
- }
- if ((MSTP_Receive_Packet.preamble2 == false) &&
- (MSTP_Receive_Packet.preamble1 == true)) {
- if (data_register == 0xFF) {
- MSTP_Receive_Packet.preamble2 = true;
- MSTP_Receive_Packet.index = 0;
- MSTP_Receive_Packet.data_len = 0;
- } else if (data_register == 0x55) {
- /* repeated preamble1 */
- return;
- } else {
- MSTP_Receive_Packet.preamble1 = false;
- }
- return;
- }
- if (DataLength == 0) {
- MSTP_Receive_Packet.header[MSTP_Receive_Packet.index] =
- data_register;
- if (MSTP_Receive_Packet.index == 5) {
- if (crc_header_good(MSTP_Receive_Packet.header, 6)) {
- FrameType = MSTP_Receive_Packet.header[0];
- DestinationAddress = MSTP_Receive_Packet.header[1];
- SourceAddress = MSTP_Receive_Packet.header[2];
- DataLength =
- (MSTP_Receive_Packet.header[3] * 256) +
- MSTP_Receive_Packet.header[4];
- if (DataLength == 0) {
- MSTP_Receive_Packet.valid_frame = true;
- } else {
- MSTP_Receive_Packet.index = 0;
- }
- } else {
- MSTP_Receive_Packet.preamble2 = false;
- MSTP_Receive_Packet.preamble2 = false;
- MSTP_Receive_Packet.index = 0;
- }
- }
- } else {
- MSTP_Receive_Packet.buffer[MSTP_Receive_Packet.index] =
- data_register;
- if (packet_info->index == packet_info->len) {
- /* PDU length ended */
- packet_info->ready = true;
- } else if (packet_info->index >= sizeof(packet_info->buffer)) {
- /* exceeded the size of the storage */
- packet_info->len = packet_info->index;
- packet_info->ready = true;
- } else {
- packet_info->index++;
- }
- MSTP_Receive_Packet.index++;
- if (packet_info->ready) {
- /* validate the CRC */
- if (!lrc_packet_good(packet_info->buffer,
- packet_info->len + 1)) {
- packet_info->ready = false;
- }
- /* pull off the CRC */
- packet_info->crc = packet_info->buffer[packet_info->len];
- /* get ready for the next packet */
- packet_info->index = 0;
- packet_info->preamble1 = false;
- packet_info->preamble2 = false;
- led_setup_off();
- }
- }
- } else {
- if (ReceivePreamble1 == true) {
- if (timer_silence_elapsed(Tframe_abort)) {
- /* we've been busy too long! Abort packet! */
- Index = 0;
- ReceivePreamble1 = false;
- ReceivePreamble2 = false;
- }
- }
- }
-}
-#endif
-
static void MSTP_Receive_Frame_FSM(
void)
{
diff --git a/bacnet-stack/ports/atmega8/h_rp.c b/bacnet-stack/ports/atmega8/h_rp.c
deleted file mode 100644
index 6b36dd02..00000000
--- a/bacnet-stack/ports/atmega8/h_rp.c
+++ /dev/null
@@ -1,173 +0,0 @@
-/**************************************************************************
-*
-* Copyright (C) 2005 Steve Karg
-*
-* Permission is hereby granted, free of charge, to any person obtaining
-* a copy of this software and associated documentation files (the
-* "Software"), to deal in the Software without restriction, including
-* without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to
-* permit persons to whom the Software is furnished to do so, subject to
-* the following conditions:
-*
-* The above copyright notice and this permission notice shall be included
-* in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*
-*********************************************************************/
-#include
-#include
-#include
-#include
-#include
-#include "config.h"
-#include "txbuf.h"
-#include "bacdef.h"
-#include "bacdcode.h"
-#include "bacerror.h"
-#include "apdu.h"
-#include "npdu.h"
-#include "abort.h"
-#include "rp.h"
-/* demo objects */
-#include "device.h"
-#if MAX_ANALOG_VALUES
-#include "av.h"
-#endif
-#if MAX_BINARY_VALUES
-#include "bv.h"
-#endif
-
-/* Encodes the property APDU and returns the length,
- or sets the error, and returns -1 */
-int Encode_Property_APDU(
- uint8_t * apdu,
- BACNET_READ_PROPERTY_DATA * rp_data,
- BACNET_ERROR_CLASS * error_class,
- BACNET_ERROR_CODE * error_code)
-{
- int apdu_len = -1;
-
- /* handle each object type */
- switch (rp_data->object_type) {
- case OBJECT_DEVICE:
- if (Device_Valid_Object_Instance_Number(rp_data->object_instance)) {
- apdu_len =
- Device_Encode_Property_APDU(&apdu[0],
- rp_data->object_instance, rp_data->object_property,
- rp_data->array_index, error_class, error_code);
- }
- break;
-#if MAX_ANALOG_VALUES
- case OBJECT_ANALOG_VALUE:
- if (Analog_Value_Valid_Instance(rp_data->object_instance)) {
- apdu_len =
- Analog_Value_Encode_Property_APDU(&apdu[0],
- rp_data->object_instance, rp_data->object_property,
- rp_data->array_index, error_class, error_code);
- }
- break;
-#endif
-#if MAX_BINARY_VALUES
- case OBJECT_BINARY_VALUE:
- if (Binary_Value_Valid_Instance(rp_data->object_instance)) {
- apdu_len =
- Binary_Value_Encode_Property_APDU(&apdu[0],
- rp_data->object_instance, rp_data->object_property,
- rp_data->array_index, error_class, error_code);
- }
- break;
-#endif
- default:
- *error_class = ERROR_CLASS_OBJECT;
- *error_code = ERROR_CODE_UNKNOWN_OBJECT;
- break;
- }
-
- return apdu_len;
-}
-
-void handler_read_property(
- uint8_t * service_request,
- uint16_t service_len,
- BACNET_ADDRESS * src,
- BACNET_CONFIRMED_SERVICE_DATA * service_data)
-{
- BACNET_READ_PROPERTY_DATA data;
- int len = 0;
- int ack_len = 0;
- int property_len = 0;
- int pdu_len = 0;
- BACNET_NPDU_DATA npdu_data;
- int bytes_sent = 0;
- BACNET_ERROR_CLASS error_class = ERROR_CLASS_OBJECT;
- BACNET_ERROR_CODE error_code = ERROR_CODE_UNKNOWN_OBJECT;
- BACNET_ADDRESS my_address;
-
- /* encode the NPDU portion of the packet */
- datalink_get_my_address(&my_address);
- npdu_encode_npdu_data(&npdu_data, false, MESSAGE_PRIORITY_NORMAL);
- pdu_len =
- npdu_encode_pdu(&Handler_Transmit_Buffer[0], src, &my_address,
- &npdu_data);
- if (service_data->segmented_message) {
- /* we don't support segmentation - send an abort */
- len =
- abort_encode_apdu(&Handler_Transmit_Buffer[pdu_len],
- service_data->invoke_id, ABORT_REASON_SEGMENTATION_NOT_SUPPORTED,
- true);
- goto RP_ABORT;
- }
- len = rp_decode_service_request(service_request, service_len, &data);
- if (len < 0) {
- /* bad decoding - send an abort */
- len =
- abort_encode_apdu(&Handler_Transmit_Buffer[pdu_len],
- service_data->invoke_id, ABORT_REASON_OTHER, true);
- goto RP_ABORT;
- }
- /* most cases will be error */
- ack_len =
- rp_ack_encode_apdu_init(&Handler_Transmit_Buffer[pdu_len],
- service_data->invoke_id, &data);
- /* FIXME: add buffer len as passed into function or use smart buffer */
- property_len =
- Encode_Property_APDU(&Handler_Transmit_Buffer[pdu_len + ack_len],
- &data, &error_class, &error_code);
- if (property_len >= 0) {
- len =
- rp_ack_encode_apdu_object_property_end(&Handler_Transmit_Buffer
- [pdu_len + property_len + ack_len]);
- len += ack_len + property_len;
- } else {
- switch (property_len) {
- /* BACnet APDU too small to fit data, so proper response is Abort */
- case BACNET_STATUS_ABORT:
- len =
- abort_encode_apdu(&Handler_Transmit_Buffer[pdu_len],
- service_data->invoke_id,
- ABORT_REASON_SEGMENTATION_NOT_SUPPORTED, true);
- break;
- default:
- len =
- bacerror_encode_apdu(&Handler_Transmit_Buffer[pdu_len],
- service_data->invoke_id, SERVICE_CONFIRMED_READ_PROPERTY,
- error_class, error_code);
- break;
- }
- }
- RP_ABORT:
- pdu_len += len;
- bytes_sent =
- datalink_send_pdu(src, &npdu_data, &Handler_Transmit_Buffer[0],
- pdu_len);
-
- return;
-}
diff --git a/bacnet-stack/ports/atmega8/h_whois.c b/bacnet-stack/ports/atmega8/h_whois.c
deleted file mode 100644
index d273bab4..00000000
--- a/bacnet-stack/ports/atmega8/h_whois.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/**************************************************************************
-*
-* Copyright (C) 2005 Steve Karg
-*
-* Permission is hereby granted, free of charge, to any person obtaining
-* a copy of this software and associated documentation files (the
-* "Software"), to deal in the Software without restriction, including
-* without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to
-* permit persons to whom the Software is furnished to do so, subject to
-* the following conditions:
-*
-* The above copyright notice and this permission notice shall be included
-* in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*
-*********************************************************************/
-#include
-#include
-#include
-#include
-#include
-#include "config.h"
-#include "txbuf.h"
-#include "bacdef.h"
-#include "bacdcode.h"
-#include "whois.h"
-#include "iam.h"
-#include "device.h"
-#include "client.h"
-#include "txbuf.h"
-
-bool Send_I_Am = true;
-
-void handler_who_is(
- uint8_t * service_request,
- uint16_t service_len,
- BACNET_ADDRESS * src)
-{
- int len = 0;
- int32_t low_limit = 0;
- int32_t high_limit = 0;
- int32_t target_device;
-
- (void) src;
- len =
- whois_decode_service_request(service_request, service_len, &low_limit,
- &high_limit);
- if (len == 0) {
- Send_I_Am = true;
- } else if (len != -1) {
- /* is my device id within the limits? */
- target_device = Device_Object_Instance_Number();
- if (((target_device >= low_limit) && (target_device <= high_limit))
- ||
- /* BACnet wildcard is the max instance number - everyone responds */
- ((BACNET_MAX_INSTANCE >= (uint32_t) low_limit) &&
- (BACNET_MAX_INSTANCE <= (uint32_t) high_limit))) {
- Send_I_Am = true;
- }
- }
-
- return;
-}
diff --git a/bacnet-stack/ports/atmega8/h_wp.c b/bacnet-stack/ports/atmega8/h_wp.c
deleted file mode 100644
index 879bcb5c..00000000
--- a/bacnet-stack/ports/atmega8/h_wp.c
+++ /dev/null
@@ -1,139 +0,0 @@
-/**************************************************************************
-*
-* Copyright (C) 2005 Steve Karg
-*
-* Permission is hereby granted, free of charge, to any person obtaining
-* a copy of this software and associated documentation files (the
-* "Software"), to deal in the Software without restriction, including
-* without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to
-* permit persons to whom the Software is furnished to do so, subject to
-* the following conditions:
-*
-* The above copyright notice and this permission notice shall be included
-* in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*
-*********************************************************************/
-#include
-#include
-#include
-#include
-#include
-#include "config.h"
-#include "txbuf.h"
-#include "bacdef.h"
-#include "bacdcode.h"
-#include "bacerror.h"
-#include "apdu.h"
-#include "npdu.h"
-#include "abort.h"
-#include "wp.h"
-/* demo objects */
-#include "device.h"
-#include "av.h"
-#include "bv.h"
-
-/* too big to reside on stack frame for PIC */
-static BACNET_WRITE_PROPERTY_DATA wp_data;
-
-void handler_write_property(
- uint8_t * service_request,
- uint16_t service_len,
- BACNET_ADDRESS * src,
- BACNET_CONFIRMED_SERVICE_DATA * service_data)
-{
- int len = 0;
- int pdu_len = 0;
- BACNET_NPDU_DATA npdu_data;
- BACNET_ERROR_CLASS error_class = ERROR_CLASS_OBJECT;
- BACNET_ERROR_CODE error_code = ERROR_CODE_UNKNOWN_OBJECT;
- int bytes_sent = 0;
- BACNET_ADDRESS my_address;
-
- /* decode the service request only */
- len = wp_decode_service_request(service_request, service_len, &wp_data);
- /* encode the NPDU portion of the packet */
- datalink_get_my_address(&my_address);
- npdu_encode_npdu_data(&npdu_data, false, MESSAGE_PRIORITY_NORMAL);
- pdu_len =
- npdu_encode_pdu(&Handler_Transmit_Buffer[0], src, &my_address,
- &npdu_data);
- /* bad decoding or something we didn't understand - send an abort */
- if (len <= 0) {
- len =
- abort_encode_apdu(&Handler_Transmit_Buffer[pdu_len],
- service_data->invoke_id, ABORT_REASON_OTHER, true);
- } else if (service_data->segmented_message) {
- len =
- abort_encode_apdu(&Handler_Transmit_Buffer[pdu_len],
- service_data->invoke_id, ABORT_REASON_SEGMENTATION_NOT_SUPPORTED,
- true);
- } else {
- switch (wp_data.object_type) {
- case OBJECT_DEVICE:
- if (Device_Write_Property(&wp_data, &error_class, &error_code)) {
- len =
- encode_simple_ack(&Handler_Transmit_Buffer[pdu_len],
- service_data->invoke_id,
- SERVICE_CONFIRMED_WRITE_PROPERTY);
- } else {
- len =
- bacerror_encode_apdu(&Handler_Transmit_Buffer[pdu_len],
- service_data->invoke_id,
- SERVICE_CONFIRMED_WRITE_PROPERTY, error_class,
- error_code);
- }
- break;
- case OBJECT_ANALOG_VALUE:
- if (Analog_Value_Write_Property(&wp_data, &error_class,
- &error_code)) {
- len =
- encode_simple_ack(&Handler_Transmit_Buffer[pdu_len],
- service_data->invoke_id,
- SERVICE_CONFIRMED_WRITE_PROPERTY);
- } else {
- len =
- bacerror_encode_apdu(&Handler_Transmit_Buffer[pdu_len],
- service_data->invoke_id,
- SERVICE_CONFIRMED_WRITE_PROPERTY, error_class,
- error_code);
- }
- break;
- case OBJECT_BINARY_VALUE:
- if (Binary_Value_Write_Property(&wp_data, &error_class,
- &error_code)) {
- len =
- encode_simple_ack(&Handler_Transmit_Buffer[pdu_len],
- service_data->invoke_id,
- SERVICE_CONFIRMED_WRITE_PROPERTY);
- } else {
- len =
- bacerror_encode_apdu(&Handler_Transmit_Buffer[pdu_len],
- service_data->invoke_id,
- SERVICE_CONFIRMED_WRITE_PROPERTY, error_class,
- error_code);
- }
- break;
- default:
- len =
- bacerror_encode_apdu(&Handler_Transmit_Buffer[pdu_len],
- service_data->invoke_id, SERVICE_CONFIRMED_WRITE_PROPERTY,
- error_class, error_code);
- break;
- }
- }
- pdu_len += len;
- bytes_sent =
- datalink_send_pdu(src, &npdu_data, &Handler_Transmit_Buffer[0],
- pdu_len);
-
- return;
-}
diff --git a/bacnet-stack/ports/atmega8/hardware.h b/bacnet-stack/ports/atmega8/hardware.h
index 19bf3364..4b08faff 100644
--- a/bacnet-stack/ports/atmega8/hardware.h
+++ b/bacnet-stack/ports/atmega8/hardware.h
@@ -32,9 +32,17 @@
#if defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ASM__)
#include
+#define WATCHDOG_INIT() {BIT_CLEAR(MCUSR, WDRF); WDTCSR = 0;}
#else
#if !defined(__AVR_ATmega168__)
#error Firmware is configured for ATmega168 only (-mmcu=atmega168)
+
+#if defined(__AVR_ATmega168__)
+#define WATCHDOG_INIT() {BIT_CLEAR(MCUSR, WDRF); WDTCSR = 0;}
+#else
+#define WATCHDOG_INIT() {BIT_CLEAR(MCUCSR, WDRF); WDTCR = 0;}
+#endif
+
#endif
#endif
#include "iar2gcc.h"
diff --git a/bacnet-stack/ports/atmega8/iar2gcc.h b/bacnet-stack/ports/atmega8/iar2gcc.h
index 98e9968d..f3d59140 100644
--- a/bacnet-stack/ports/atmega8/iar2gcc.h
+++ b/bacnet-stack/ports/atmega8/iar2gcc.h
@@ -1,49 +1,45 @@
-/*####COPYRIGHTBEGIN####
- -------------------------------------------
- Copyright (C) 2007 Steve Karg
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- as published by the Free Software Foundation; either version 2
- of the License, or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to:
- The Free Software Foundation, Inc.
- 59 Temple Place - Suite 330
- Boston, MA 02111-1307, USA.
-
- As a special exception, if other files instantiate templates or
- use macros or inline functions from this file, or you compile
- this file and link it with other works to produce a work based
- on this file, this file does not by itself cause the resulting
- work to be covered by the GNU General Public License. However
- the source code for this file must still be made available in
- accordance with section (3) of the GNU General Public License.
-
- This exception does not invalidate any other reasons why a work
- based on this file might be covered by the GNU General Public
- License.
- -------------------------------------------
-####COPYRIGHTEND####*/
+/**************************************************************************
+*
+* Copyright (C) 2012 Steve Karg
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to deal in the Software without restriction, including
+* without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to
+* permit persons to whom the Software is furnished to do so, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*********************************************************************/
#ifndef IAR2GCC_H
#define IAR2GCC_H
+/* common embedded extensions for different compilers */
+
#if !defined(F_CPU)
-#define F_CPU (7372800)
+#error You must define F_CPU - clock frequency!
+#endif
+
+#if defined (__CROSSWORKS_AVR)
+#include
+#include
#endif
/* IAR */
-#if defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ASM__)
+#if defined(__ICCAVR__)
#include
-#include
-/* BitValue is used alot in GCC examples */
-#define _BV(bit_num) (1 << (bit_num))
+#include
+#include
/* inline function */
static inline void _delay_us(
@@ -55,6 +51,56 @@ static inline void _delay_us(
}
#endif
+#if defined(__GNUC__)
+#include
+#endif
+
+/* adjust some definitions to common versions */
+#if defined (__CROSSWORKS_AVR)
+#if (__TARGET_PROCESSOR == ATmega644P)
+#define PRR PRR0
+#define UBRR0 UBRR0W
+#define UBRR1 UBRR1W
+
+#define PA0 PORTA0
+#define PA1 PORTA1
+#define PA2 PORTA2
+#define PA3 PORTA3
+#define PA4 PORTA4
+#define PA5 PORTA5
+#define PA6 PORTA6
+#define PA7 PORTA7
+
+#define PB0 PORTB0
+#define PB1 PORTB1
+#define PB2 PORTB2
+#define PB3 PORTB3
+#define PB4 PORTB4
+#define PB5 PORTB5
+#define PB6 PORTB6
+#define PB7 PORTB7
+
+#define PC0 PORTC0
+#define PC1 PORTC1
+#define PC2 PORTC2
+#define PC3 PORTC3
+#define PC4 PORTC4
+#define PC5 PORTC5
+#define PC6 PORTC6
+#define PC7 PORTC7
+
+#define PD0 PORTD0
+#define PD1 PORTD1
+#define PD2 PORTD2
+#define PD3 PORTD3
+#define PD4 PORTD4
+#define PD5 PORTD5
+#define PD6 PORTD6
+#define PD7 PORTD7
+
+#endif
+#endif
+
/* Input/Output Registers */
#if defined(__GNUC__)
#include
@@ -192,27 +238,54 @@ typedef struct {
/* Interrupts */
#if defined(__ICCAVR__)
#define PRAGMA(x) _Pragma( #x )
-#define ISR(vec) PRAGMA( vector=vec ) __interrupt void handler_##vec(void)
-#endif
-#if defined(__GNUC__)
+#define ISR(vec) \
+ /* function prototype for use with "require protoptypes" option. */ \
+ PRAGMA( vector=vec ) __interrupt void handler_##vec(void); \
+ PRAGMA( vector=vec ) __interrupt void handler_##vec(void)
+#elif defined(__GNUC__)
#include
+#elif defined (__CROSSWORKS_AVR)
+#define ISR(vec) void handler_##vec(void) __interrupt[vec]
+#else
+#error ISR() not defined!
#endif
/* Flash */
#if defined(__ICCAVR__)
#define FLASH_DECLARE(x) __flash x
-#endif
-#if defined(__GNUC__)
+#elif defined(__GNUC__)
#define FLASH_DECLARE(x) x __attribute__((__progmem__))
+#elif defined (__CROSSWORKS_AVR)
+#define FLASH_DECLARE (x) const __code x
#endif
/* EEPROM */
#if defined(__ICCAVR__)
#define EEPROM_DECLARE(x) __eeprom x
-#endif
-#if defined(__GNUC__)
+#elif defined(__GNUC__)
#include
#define EEPROM_DECLARE(x) x __attribute__((section (".eeprom")))
+#if ((__GNUC__ < 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ < 3)) || \
+ ((__GNUC__ == 4) && (__GNUC_MINOR__ == 3) && (__GNUC_PATCHLEVEL__ <= 3)))
+ /* bug in WinAVR - not quite IAR compatible */
+#ifndef __EEPUT
+#define __EEPUT _EEPUT
+#endif
+#ifndef __EEGET
+#define __EEGET _EEGET
+#endif
+#endif
+#elif defined (__CROSSWORKS_AVR)
+/* use functions defined in crt0.s to mimic IAR macros */
+void __uint8_eeprom_store(
+ unsigned char byte,
+ unsigned addr);
+unsigned char __uint8_eeprom_load(
+ unsigned addr);
+#define __EEPUT(addr, var) \
+ __uint8_eeprom_store((unsigned char)(var), (unsigned)(addr))
+#define __EEGET(var, addr) \
+ (var) = __uint8_eeprom_load((unsigned)(addr))
#endif
/* IAR intrinsic routines */
@@ -223,4 +296,50 @@ typedef struct {
#define __root
#endif
+/* watchdog defines in GCC */
+#if defined(__ICCAVR__) || defined(__CROSSWORKS_AVR)
+#define WDTO_15MS 0
+#define WDTO_30MS 1
+#define WDTO_60MS 2
+#define WDTO_120MS 3
+#define WDTO_250MS 4
+#define WDTO_500MS 5
+#define WDTO_1S 6
+#define WDTO_2S 7
+#endif
+
+/* power macros in GCC-AVR */
+#if (defined(__ICCAVR__) && (defined(__ATmega644P__))) || \
+ (defined(__CROSSWORKS_AVR) && (__TARGET_PROCESSOR == ATmega644P))
+#define power_adc_enable() (PRR &= (uint8_t)~(1 << PRADC))
+#define power_spi_enable() (PRR &= (uint8_t)~(1 << PRSPI))
+#define power_usart0_enable() (PRR &= (uint8_t)~(1 << PRUSART0))
+#define power_usart1_enable() (PRR &= (uint8_t)~(1 << PRUSART1))
+#define power_timer0_enable() (PRR &= (uint8_t)~(1 << PRTIM0))
+#define power_timer1_enable() (PRR &= (uint8_t)~(1 << PRTIM1))
+#define power_timer2_enable() (PRR &= (uint8_t)~(1 << PRTIM2))
+#endif
+#if (defined(__ICCAVR__) && (defined(__ATmega1284P__))) || \
+ (defined(__CROSSWORKS_AVR) && (__TARGET_PROCESSOR == ATmega1284P))
+#define power_adc_enable() (PRR0 &= (uint8_t)~(1 << PRADC))
+#define power_spi_enable() (PRR0 &= (uint8_t)~(1 << PRSPI))
+#define power_usart0_enable() (PRR0 &= (uint8_t)~(1 << PRUSART0))
+#define power_usart1_enable() (PRR0 &= (uint8_t)~(1 << PRUSART1))
+#define power_timer0_enable() (PRR0 &= (uint8_t)~(1 << PRTIM0))
+#define power_timer1_enable() (PRR0 &= (uint8_t)~(1 << PRTIM1))
+#define power_timer2_enable() (PRR0 &= (uint8_t)~(1 << PRTIM2))
+#endif
+#if (defined(__GNUC__) && ((__GNUC__ == 4) && (__GNUC_MINOR__ < 5)))
+#if defined(__AVR_ATmega644P__)
+ /* bug in WinAVR - fixed in later versions */
+#define power_usart1_enable() (PRR &= (uint8_t)~(1 << PRUSART1))
+#elif defined(__AVR_ATmega1284P__)
+#define power_usart1_enable() (PRR0 &= (uint8_t)~(1 << PRUSART1))
+#endif
+#endif
+
+#if defined(__CROSSWORKS_AVR)
+#define inline
+#endif
+
#endif
diff --git a/bacnet-stack/ports/atmega8/main.c b/bacnet-stack/ports/atmega8/main.c
index 82e5de1b..61b5c0de 100644
--- a/bacnet-stack/ports/atmega8/main.c
+++ b/bacnet-stack/ports/atmega8/main.c
@@ -84,13 +84,7 @@ static void init(
PORTD = 0;
/* Configure the watchdog timer - Disabled for testing */
-#if defined(__AVR_ATmega168__)
- BIT_CLEAR(MCUSR, WDRF);
- WDTCSR = 0;
-#else
- BIT_CLEAR(MCUCSR, WDRF);
- WDTCR = 0;
-#endif
+ WATCHDOG_INIT();
/* Configure Specialized Hardware */
RS485_Initialize();
diff --git a/bacnet-stack/ports/atmega8/rs485.c b/bacnet-stack/ports/atmega8/rs485.c
index e95b5de5..4991e86e 100644
--- a/bacnet-stack/ports/atmega8/rs485.c
+++ b/bacnet-stack/ports/atmega8/rs485.c
@@ -31,10 +31,11 @@
#include
#include
#include
-/*#include "mstp.h" */
+#include "bits.h"
/* This file has been customized for use with ATMEGA168 */
-#if defined(__AVR_ATmega168__)
+#if (defined(__ICCAVR__) && (defined(__ATmega168__))) || \
+ (defined(__GNUC__) && defined(__AVR_ATmega168__))
/* USART defines for RS-485 port */
#define UCSRB UCSR0B
#define TXEN TXEN0
@@ -152,6 +153,22 @@ bool RS485_Set_Baud_Rate(
return valid;
}
+/****************************************************************************
+* DESCRIPTION: Enable or disable the transmitter
+* RETURN: none
+* ALGORITHM: none
+* NOTES: none
+*****************************************************************************/
+void RS485_Transmitter_Enable(
+ bool enable)
+{
+ if (enable) {
+ BIT_SET(PORTD, PD2);
+ } else {
+ BIT_CLEAR(PORTD, PD2);
+ }
+}
+
/****************************************************************************
* DESCRIPTION: Waits on the SilenceTimer for 40 bits.
* RETURN: none
@@ -181,22 +198,6 @@ void RS485_Turnaround_Delay(
BIT_SET(UCSR0A, TXC0);
}
-/****************************************************************************
-* DESCRIPTION: Enable or disable the transmitter
-* RETURN: none
-* ALGORITHM: none
-* NOTES: none
-*****************************************************************************/
-void RS485_Transmitter_Enable(
- bool enable)
-{
- if (enable) {
- BIT_SET(PORTD, PD2);
- } else {
- BIT_CLEAR(PORTD, PD2);
- }
-}
-
/****************************************************************************
* DESCRIPTION: Send some data and wait until it is sent
* RETURN: none
diff --git a/bacnet-stack/ports/bdk-atxx4-mstp/bo.c b/bacnet-stack/ports/bdk-atxx4-mstp/bo.c
index 52d1878b..f6414bf2 100644
--- a/bacnet-stack/ports/bdk-atxx4-mstp/bo.c
+++ b/bacnet-stack/ports/bdk-atxx4-mstp/bo.c
@@ -180,17 +180,22 @@ bool Binary_Output_Present_Value_Set(
return status;
}
-static void Binary_Output_Polarity_Set(
+bool Binary_Output_Polarity_Set(
uint32_t instance,
BACNET_POLARITY polarity)
{
+ bool status = false;
+
if (instance < MAX_BINARY_OUTPUTS) {
if (polarity < MAX_POLARITY) {
Polarity[instance] = polarity;
seeprom_bytes_write(NV_SEEPROM_BINARY_OUTPUT(instance,
NV_SEEPROM_BO_POLARITY), &Polarity[instance], 1);
+ status = true;
}
}
+
+ return status;
}
BACNET_POLARITY Binary_Output_Polarity(
diff --git a/bacnet-stack/ports/stm32f10x/bo.c b/bacnet-stack/ports/stm32f10x/bo.c
index d60b867e..04a4b22c 100644
--- a/bacnet-stack/ports/stm32f10x/bo.c
+++ b/bacnet-stack/ports/stm32f10x/bo.c
@@ -175,15 +175,20 @@ bool Binary_Output_Present_Value_Set(
return status;
}
-static void Binary_Output_Polarity_Set(
+bool Binary_Output_Polarity_Set(
uint32_t instance,
BACNET_POLARITY polarity)
{
+ bool status = false;
+
if (instance < MAX_BINARY_OUTPUTS) {
if (polarity < MAX_POLARITY) {
Polarity[instance] = polarity;
+ status = true;
}
}
+
+ return status;
}
BACNET_POLARITY Binary_Output_Polarity(
@@ -198,7 +203,7 @@ BACNET_POLARITY Binary_Output_Polarity(
return polarity;
}
-static void Binary_Output_Out_Of_Service_Set(
+void Binary_Output_Out_Of_Service_Set(
uint32_t instance,
bool flag)
{