Enhanced the ATmega168 demo project to include WriteProperty service to the Analog Value and Device objects.

This commit is contained in:
skarg
2008-03-19 23:17:19 +00:00
parent fe0563f751
commit 944cb46e51
10 changed files with 52 additions and 36 deletions
+4
View File
@@ -114,6 +114,10 @@ extern "C" {
bool characterstring_copy( bool characterstring_copy(
BACNET_CHARACTER_STRING * dest, BACNET_CHARACTER_STRING * dest,
BACNET_CHARACTER_STRING * src); BACNET_CHARACTER_STRING * src);
bool characterstring_ansi_copy(
char * dest,
size_t dest_max_len,
BACNET_CHARACTER_STRING * src);
/* returns true if the strings are the same length, encoding, value */ /* returns true if the strings are the same length, encoding, value */
bool characterstring_same( bool characterstring_same(
BACNET_CHARACTER_STRING * dest, BACNET_CHARACTER_STRING * dest,
+4
View File
@@ -98,6 +98,10 @@ BFLAGS += -DBIG_ENDIAN=0
BFLAGS += -DMAX_TSM_TRANSACTIONS=0 BFLAGS += -DMAX_TSM_TRANSACTIONS=0
#BFLAGS += -DCRC_USE_TABLE #BFLAGS += -DCRC_USE_TABLE
BFLAGS += -DBACAPP_REAL BFLAGS += -DBACAPP_REAL
BFLAGS += -DBACAPP_OBJECT_ID
BFLAGS += -DBACAPP_UNSIGNED
BFLAGS += -DBACAPP_CHARACTER_STRING
BFLAGS += -DWRITE_PROPERTY
BFLAGS += -DMAX_ANALOG_VALUES=10 BFLAGS += -DMAX_ANALOG_VALUES=10
CFLAGS = $(COMMON) CFLAGS = $(COMMON)
# dead code removal # dead code removal
+2 -2
View File
@@ -49,7 +49,7 @@ bool apdu_service_supported(
if (service_supported == SERVICE_SUPPORTED_READ_PROPERTY) { if (service_supported == SERVICE_SUPPORTED_READ_PROPERTY) {
status = true; status = true;
} }
#if 0 #ifdef WRITE_PROPERTY
if (service_supported == SERVICE_SUPPORTED_WRITE_PROPERTY) { if (service_supported == SERVICE_SUPPORTED_WRITE_PROPERTY) {
status = true; status = true;
} }
@@ -109,7 +109,7 @@ void apdu_handler(
handler_read_property(service_request, service_request_len, handler_read_property(service_request, service_request_len,
src, &service_data); src, &service_data);
} }
#if 0 #ifdef WRITE_PROPERTY
else if (service_choice == SERVICE_CONFIRMED_WRITE_PROPERTY) { else if (service_choice == SERVICE_CONFIRMED_WRITE_PROPERTY) {
handler_write_property(service_request, handler_write_property(service_request,
service_request_len, src, &service_data); service_request_len, src, &service_data);
+6
View File
@@ -27,6 +27,7 @@
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "hardware.h"
#include "bacdef.h" #include "bacdef.h"
#include "bacdcode.h" #include "bacdcode.h"
#include "bacenum.h" #include "bacenum.h"
@@ -182,6 +183,11 @@ bool Analog_Value_Write_Property(
object_index = object_index =
Analog_Value_Instance_To_Index(wp_data->object_instance); Analog_Value_Instance_To_Index(wp_data->object_instance);
AV_Present_Value[object_index] = value.type.Real; AV_Present_Value[object_index] = value.type.Real;
if ((AV_Present_Value[0] < 1.0) && (AV_Present_Value[0] > -1.0)) {
LED_GREEN_OFF();
} else {
LED_GREEN_ON();
}
status = true; status = true;
} else { } else {
*error_class = ERROR_CLASS_PROPERTY; *error_class = ERROR_CLASS_PROPERTY;
File diff suppressed because one or more lines are too long
+5 -13
View File
@@ -358,12 +358,10 @@ int Device_Encode_Property_APDU(
apdu_len = apdu_len =
encode_application_unsigned(&apdu[0], dlmstp_max_master()); encode_application_unsigned(&apdu[0], dlmstp_max_master());
break; break;
#if 0
case 9600: case 9600:
apdu_len = apdu_len =
encode_application_unsigned(&apdu[0], RS485_Get_Baud_Rate()); encode_application_unsigned(&apdu[0], RS485_Get_Baud_Rate());
break; break;
#endif
default: default:
*error_class = ERROR_CLASS_PROPERTY; *error_class = ERROR_CLASS_PROPERTY;
*error_code = ERROR_CODE_UNKNOWN_PROPERTY; *error_code = ERROR_CODE_UNKNOWN_PROPERTY;
@@ -374,7 +372,6 @@ int Device_Encode_Property_APDU(
return apdu_len; return apdu_len;
} }
#if 0
bool Device_Write_Property( bool Device_Write_Property(
BACNET_WRITE_PROPERTY_DATA * wp_data, BACNET_WRITE_PROPERTY_DATA * wp_data,
BACNET_ERROR_CLASS * error_class, BACNET_ERROR_CLASS * error_class,
@@ -444,19 +441,15 @@ bool Device_Write_Property(
case PROP_OBJECT_NAME: case PROP_OBJECT_NAME:
if (value.tag == BACNET_APPLICATION_TAG_CHARACTER_STRING) { if (value.tag == BACNET_APPLICATION_TAG_CHARACTER_STRING) {
uint8_t encoding; uint8_t encoding;
size_t len;
encoding = encoding =
characterstring_encoding(&value.type.Character_String); characterstring_encoding(&value.type.Character_String);
len = characterstring_length(&value.type.Character_String);
if (encoding == CHARACTER_ANSI_X34) { if (encoding == CHARACTER_ANSI_X34) {
if (len <= 20) { if (characterstring_ansi_copy(
/* FIXME: set the name */ &Object_Name[0],
/* Display_Set_Name( sizeof(Object_Name),
characterstring_value(&value.type.Character_String)); */ &value.type.Character_String)) {
/* FIXME: All the object names in a device must be unique. status = true;
Disallow setting the Device Object Name to any objects in
the device. */
} else { } else {
*error_class = ERROR_CLASS_PROPERTY; *error_class = ERROR_CLASS_PROPERTY;
*error_code = ERROR_CODE_NO_SPACE_TO_WRITE_PROPERTY; *error_code = ERROR_CODE_NO_SPACE_TO_WRITE_PROPERTY;
@@ -492,4 +485,3 @@ bool Device_Write_Property(
return status; return status;
} }
#endif
+1 -1
View File
@@ -82,7 +82,6 @@ void handler_write_property(
true); true);
} else { } else {
switch (wp_data.object_type) { switch (wp_data.object_type) {
#if 0
case OBJECT_DEVICE: case OBJECT_DEVICE:
if (Device_Write_Property(&wp_data, &error_class, &error_code)) { if (Device_Write_Property(&wp_data, &error_class, &error_code)) {
len = len =
@@ -97,6 +96,7 @@ void handler_write_property(
error_code); error_code);
} }
break; break;
#if 0
case OBJECT_ANALOG_INPUT: case OBJECT_ANALOG_INPUT:
case OBJECT_BINARY_INPUT: case OBJECT_BINARY_INPUT:
error_class = ERROR_CLASS_PROPERTY; error_class = ERROR_CLASS_PROPERTY;
+8
View File
@@ -40,4 +40,12 @@
#include "iar2gcc.h" #include "iar2gcc.h"
#include "avr035.h" #include "avr035.h"
#define LED_NPDU_INIT() BIT_SET(DDRD, DDD5)
#define LED_NPDU_ON() BIT_CLEAR(PORTD, PD5)
#define LED_NPDU_OFF() BIT_SET(PORTD, PD5)
#define LED_GREEN_INIT() BIT_SET(DDRD, DDD4)
#define LED_GREEN_ON() BIT_CLEAR(PORTD, PD4)
#define LED_GREEN_OFF() BIT_SET(PORTD, PD4)
#endif #endif
+2 -19
View File
@@ -40,14 +40,6 @@ const char *BACnet_Version = "1.0";
/* For porting to IAR, see: /* For porting to IAR, see:
http://www.avrfreaks.net/wiki/index.php/Documentation:AVR_GCC/IarToAvrgcc*/ http://www.avrfreaks.net/wiki/index.php/Documentation:AVR_GCC/IarToAvrgcc*/
#define LED_NPDU_INIT() BIT_SET(DDRD, DDD5)
#define LED_NPDU_ON() BIT_CLEAR(PORTD, PD5)
#define LED_NPDU_OFF() BIT_SET(PORTD, PD5)
#define LED_GREEN_INIT() BIT_SET(DDRD, DDD4)
#define LED_GREEN_ON() BIT_CLEAR(PORTD, PD4)
#define LED_GREEN_OFF() BIT_SET(PORTD, PD4)
/* dummy function */ /* dummy function */
bool dcc_communication_enabled( bool dcc_communication_enabled(
void) void)
@@ -98,9 +90,9 @@ static void init(
/* default: off, output */ /* default: off, output */
LED_NPDU_OFF(); LED_NPDU_OFF();
LED_NPDU_INIT(); LED_NPDU_INIT();
/* Configure Software active LED */ /* Configure Software LED */
LED_GREEN_INIT(); LED_GREEN_INIT();
LED_GREEN_ON(); LED_GREEN_OFF();
/* Configure Timer0 for millisecond timer */ /* Configure Timer0 for millisecond timer */
Timer_Initialize(); Timer_Initialize();
@@ -142,14 +134,6 @@ static void input_switch_read(
} }
} }
static void Analog_Value_Task(
void)
{
extern float AV_Present_Value[MAX_ANALOG_VALUES];
AV_Present_Value[0] = 3.14159F;
}
static uint8_t PDUBuffer[MAX_MPDU]; static uint8_t PDUBuffer[MAX_MPDU];
int main( int main(
void) void)
@@ -167,7 +151,6 @@ int main(
for (;;) { for (;;) {
input_switch_read(); input_switch_read();
task_milliseconds(); task_milliseconds();
Analog_Value_Task();
/* other tasks */ /* other tasks */
/* BACnet handling */ /* BACnet handling */
pdu_len = datalink_receive(&src, &PDUBuffer[0], sizeof(PDUBuffer), 0); pdu_len = datalink_receive(&src, &PDUBuffer[0], sizeof(PDUBuffer), 0);
+19
View File
@@ -246,6 +246,25 @@ bool characterstring_copy(
characterstring_value(src), characterstring_length(src)); characterstring_value(src), characterstring_length(src));
} }
bool characterstring_ansi_copy(
char * dest,
size_t dest_max_len,
BACNET_CHARACTER_STRING * src)
{
size_t i; /* counter */
if (dest && src &&
(src->encoding == CHARACTER_ANSI_X34) &&
(src->length < dest_max_len)) {
for (i = 0; i < src->length; i++) {
dest[i] = src->value[i];
}
return true;
}
return false;
}
/* returns true if the character encoding and string contents are the same */ /* returns true if the character encoding and string contents are the same */
bool characterstring_same( bool characterstring_same(
BACNET_CHARACTER_STRING * dest, BACNET_CHARACTER_STRING * dest,