diff --git a/bacnet-stack/include/bacstr.h b/bacnet-stack/include/bacstr.h index 289776bc..fa8624b9 100644 --- a/bacnet-stack/include/bacstr.h +++ b/bacnet-stack/include/bacstr.h @@ -114,6 +114,10 @@ extern "C" { bool characterstring_copy( BACNET_CHARACTER_STRING * dest, 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 */ bool characterstring_same( BACNET_CHARACTER_STRING * dest, diff --git a/bacnet-stack/ports/atmega168/Makefile b/bacnet-stack/ports/atmega168/Makefile index 8e90d91b..7b56969e 100644 --- a/bacnet-stack/ports/atmega168/Makefile +++ b/bacnet-stack/ports/atmega168/Makefile @@ -98,6 +98,10 @@ BFLAGS += -DBIG_ENDIAN=0 BFLAGS += -DMAX_TSM_TRANSACTIONS=0 #BFLAGS += -DCRC_USE_TABLE BFLAGS += -DBACAPP_REAL +BFLAGS += -DBACAPP_OBJECT_ID +BFLAGS += -DBACAPP_UNSIGNED +BFLAGS += -DBACAPP_CHARACTER_STRING +BFLAGS += -DWRITE_PROPERTY BFLAGS += -DMAX_ANALOG_VALUES=10 CFLAGS = $(COMMON) # dead code removal diff --git a/bacnet-stack/ports/atmega168/apdu.c b/bacnet-stack/ports/atmega168/apdu.c index 1bf594f5..cfd0f9cc 100644 --- a/bacnet-stack/ports/atmega168/apdu.c +++ b/bacnet-stack/ports/atmega168/apdu.c @@ -49,7 +49,7 @@ bool apdu_service_supported( if (service_supported == SERVICE_SUPPORTED_READ_PROPERTY) { status = true; } -#if 0 +#ifdef WRITE_PROPERTY if (service_supported == SERVICE_SUPPORTED_WRITE_PROPERTY) { status = true; } @@ -109,7 +109,7 @@ void apdu_handler( handler_read_property(service_request, service_request_len, src, &service_data); } -#if 0 +#ifdef WRITE_PROPERTY else if (service_choice == SERVICE_CONFIRMED_WRITE_PROPERTY) { handler_write_property(service_request, service_request_len, src, &service_data); diff --git a/bacnet-stack/ports/atmega168/av.c b/bacnet-stack/ports/atmega168/av.c index 699164d2..16bb1dde 100644 --- a/bacnet-stack/ports/atmega168/av.c +++ b/bacnet-stack/ports/atmega168/av.c @@ -27,6 +27,7 @@ #include #include +#include "hardware.h" #include "bacdef.h" #include "bacdcode.h" #include "bacenum.h" @@ -182,6 +183,11 @@ bool Analog_Value_Write_Property( object_index = Analog_Value_Instance_To_Index(wp_data->object_instance); 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; } else { *error_class = ERROR_CLASS_PROPERTY; diff --git a/bacnet-stack/ports/atmega168/bacnet.aps b/bacnet-stack/ports/atmega168/bacnet.aps index 19bdf7d4..3b0c467f 100644 --- a/bacnet-stack/ports/atmega168/bacnet.aps +++ b/bacnet-stack/ports/atmega168/bacnet.aps @@ -1 +1 @@ -13-Aug-2007 15:08:2714-Mar-2008 17:14:04013-Aug-2007 15:08:2744, 13, 0, 528AVR GCC241bacnet13-Aug-2007 15:11:0713-Aug-2007 15:11:07241013-Aug-2007 15:11:0744, 13, 0, 528AVR GCCbacnet.elfC:\code\bacnet-stack\ports\atmega168\ATmega168falseR00R01R02R03R04R05R06R07R08R09R10R11R12R13R14R15R16R17R18R19R20R21R22R23R24R25R26R27R28R29R30R31AVR DragonAVR SimulatorATmega168.xmlAuto00property_len0main.crs485.ctimer.cdlmstp.cC:\code\bacnet-stack\demo\handler\txbuf.cdevice.cC:\code\bacnet-stack\src\crc.cC:\code\bacnet-stack\src\npdu.capdu.ch_rp.cC:\code\bacnet-stack\src\iam.cav.ch_wp.cC:\code\bacnet-stack\src\bacapp.cavr035.hhardware.hrs485.htimer.hC:\code\bacnet-stack\include\crc.hC:\code\bacnet-stack\include\dlmstp.hC:\code\bacnet-stack\include\iam.hC:\code\bacnet-stack\include\npdu.hC:\code\bacnet-stack\include\txbuf.hC:\code\bacnet-stack\include\bacenum.hC:\code\bacnet-stack\include\bacdcode.hMakefiledefaultYESMakefileatmega168100bacnet.elfdefault\1..\..\demo\handler\.\..\..\..\..\demo\object\-Wall -gdwarf-2 -DMAX_APDU=50 -DBACDL_MSTP -DBIG_ENDIAN=0 -DF_CPU=7372800UL -O0 -fsigned-chardefault1C:\WinAVR-20071221rc1\bin\avr-gcc.exeC:\WinAVR-20071221rc1\utils\bin\make.exe0282161937372800011000001920010000000001011main100000main.c25700001dlmstp.c25800002timer.c25700003C:\code\bacnet-stack\src\iam.c25800004C:\code\bacnet-stack\src\crc.c25800005av.c25700006Makefile100007rs485.c257 +13-Aug-2007 15:08:2719-Mar-2008 18:15:53013-Aug-2007 15:08:2744, 13, 0, 528AVR GCC241bacnet13-Aug-2007 15:11:0713-Aug-2007 15:11:07241013-Aug-2007 15:11:0744, 13, 0, 528AVR GCCbacnet.elfC:\code\bacnet-stack\ports\atmega168\ATmega168falseR00R01R02R03R04R05R06R07R08R09R10R11R12R13R14R15R16R17R18R19R20R21R22R23R24R25R26R27R28R29R30R31AVR DragonAVR SimulatorATmega168.xmlAuto00property_len0main.crs485.ctimer.cdlmstp.cC:\code\bacnet-stack\demo\handler\txbuf.cdevice.cC:\code\bacnet-stack\src\crc.cC:\code\bacnet-stack\src\npdu.capdu.ch_rp.cC:\code\bacnet-stack\src\iam.cav.ch_wp.cC:\code\bacnet-stack\src\bacapp.cC:\code\bacnet-stack\src\bacstr.cavr035.hhardware.hrs485.htimer.hC:\code\bacnet-stack\include\crc.hC:\code\bacnet-stack\include\dlmstp.hC:\code\bacnet-stack\include\iam.hC:\code\bacnet-stack\include\npdu.hC:\code\bacnet-stack\include\txbuf.hC:\code\bacnet-stack\include\bacenum.hC:\code\bacnet-stack\include\bacdcode.hC:\code\bacnet-stack\include\bacapp.hC:\code\bacnet-stack\include\bacstr.hMakefiledefaultYESMakefileatmega168100bacnet.elfdefault\1..\..\demo\handler\.\..\..\..\..\demo\object\-Wall -gdwarf-2 -DMAX_APDU=50 -DBACDL_MSTP -DBIG_ENDIAN=0 -DF_CPU=7372800UL -O0 -fsigned-chardefault1C:\WinAVR-20071221rc1\bin\avr-gcc.exeC:\WinAVR-20071221rc1\utils\bin\make.exe0282161937372800011000001920010000000001011main100000main.c25900001dlmstp.c25800002C:\code\bacnet-stack\src\iam.c25800003C:\code\bacnet-stack\src\crc.c25800004device.c25700005C:\code\bacnet-stack\src\bacstr.c25700006av.c257 diff --git a/bacnet-stack/ports/atmega168/device.c b/bacnet-stack/ports/atmega168/device.c index 4bb023c2..e8423a8d 100644 --- a/bacnet-stack/ports/atmega168/device.c +++ b/bacnet-stack/ports/atmega168/device.c @@ -358,12 +358,10 @@ int Device_Encode_Property_APDU( apdu_len = encode_application_unsigned(&apdu[0], dlmstp_max_master()); break; -#if 0 case 9600: apdu_len = encode_application_unsigned(&apdu[0], RS485_Get_Baud_Rate()); break; -#endif default: *error_class = ERROR_CLASS_PROPERTY; *error_code = ERROR_CODE_UNKNOWN_PROPERTY; @@ -374,7 +372,6 @@ int Device_Encode_Property_APDU( return apdu_len; } -#if 0 bool Device_Write_Property( BACNET_WRITE_PROPERTY_DATA * wp_data, BACNET_ERROR_CLASS * error_class, @@ -444,19 +441,15 @@ bool Device_Write_Property( case PROP_OBJECT_NAME: if (value.tag == BACNET_APPLICATION_TAG_CHARACTER_STRING) { uint8_t encoding; - size_t len; encoding = characterstring_encoding(&value.type.Character_String); - len = characterstring_length(&value.type.Character_String); if (encoding == CHARACTER_ANSI_X34) { - if (len <= 20) { - /* FIXME: set the name */ - /* Display_Set_Name( - characterstring_value(&value.type.Character_String)); */ - /* FIXME: All the object names in a device must be unique. - Disallow setting the Device Object Name to any objects in - the device. */ + if (characterstring_ansi_copy( + &Object_Name[0], + sizeof(Object_Name), + &value.type.Character_String)) { + status = true; } else { *error_class = ERROR_CLASS_PROPERTY; *error_code = ERROR_CODE_NO_SPACE_TO_WRITE_PROPERTY; @@ -492,4 +485,3 @@ bool Device_Write_Property( return status; } -#endif diff --git a/bacnet-stack/ports/atmega168/h_wp.c b/bacnet-stack/ports/atmega168/h_wp.c index f5e96087..3fff03d4 100644 --- a/bacnet-stack/ports/atmega168/h_wp.c +++ b/bacnet-stack/ports/atmega168/h_wp.c @@ -82,7 +82,6 @@ void handler_write_property( true); } else { switch (wp_data.object_type) { -#if 0 case OBJECT_DEVICE: if (Device_Write_Property(&wp_data, &error_class, &error_code)) { len = @@ -97,6 +96,7 @@ void handler_write_property( error_code); } break; +#if 0 case OBJECT_ANALOG_INPUT: case OBJECT_BINARY_INPUT: error_class = ERROR_CLASS_PROPERTY; diff --git a/bacnet-stack/ports/atmega168/hardware.h b/bacnet-stack/ports/atmega168/hardware.h index c04c9199..a402590c 100644 --- a/bacnet-stack/ports/atmega168/hardware.h +++ b/bacnet-stack/ports/atmega168/hardware.h @@ -40,4 +40,12 @@ #include "iar2gcc.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 diff --git a/bacnet-stack/ports/atmega168/main.c b/bacnet-stack/ports/atmega168/main.c index 6bc000fc..18fa114f 100644 --- a/bacnet-stack/ports/atmega168/main.c +++ b/bacnet-stack/ports/atmega168/main.c @@ -40,14 +40,6 @@ const char *BACnet_Version = "1.0"; /* For porting to IAR, see: 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 */ bool dcc_communication_enabled( void) @@ -98,9 +90,9 @@ static void init( /* default: off, output */ LED_NPDU_OFF(); LED_NPDU_INIT(); - /* Configure Software active LED */ + /* Configure Software LED */ LED_GREEN_INIT(); - LED_GREEN_ON(); + LED_GREEN_OFF(); /* Configure Timer0 for millisecond timer */ 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]; int main( void) @@ -167,7 +151,6 @@ int main( for (;;) { input_switch_read(); task_milliseconds(); - Analog_Value_Task(); /* other tasks */ /* BACnet handling */ pdu_len = datalink_receive(&src, &PDUBuffer[0], sizeof(PDUBuffer), 0); diff --git a/bacnet-stack/src/bacstr.c b/bacnet-stack/src/bacstr.c index 43d55c25..3592dc49 100644 --- a/bacnet-stack/src/bacstr.c +++ b/bacnet-stack/src/bacstr.c @@ -246,6 +246,25 @@ bool characterstring_copy( 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 */ bool characterstring_same( BACNET_CHARACTER_STRING * dest,