mirror of
				https://github.com/stargieg/bacnet-stack
				synced 2025-10-26 23:35:52 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			123 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /**************************************************************************
 | |
| *
 | |
| * Copyright (C) 2007 Steve Karg <skarg@users.sourceforge.net>
 | |
| *
 | |
| * 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 <stdbool.h>
 | |
| #include <stdint.h>
 | |
| #include "hardware.h"
 | |
| #include "timer.h"
 | |
| #include "rs485.h"
 | |
| #include "datalink.h"
 | |
| #include "npdu.h"
 | |
| #include "txbuf.h"
 | |
| #include "iam.h"
 | |
| #include "device.h"
 | |
| #include "av.h"
 | |
| #include "handlers.h"
 | |
| 
 | |
| /* local version override */
 | |
| const char *BACnet_Version = "1.0";
 | |
| 
 | |
| /* For porting to IAR, see:
 | |
|    http://www.avrfreaks.net/wiki/index.php/Documentation:AVR_GCC/IarToAvrgcc*/
 | |
| 
 | |
| /* dummy function - so we can use default demo handlers */
 | |
| bool dcc_communication_enabled(
 | |
|     void)
 | |
| {
 | |
|     return true;
 | |
| }
 | |
| 
 | |
| static void init(
 | |
|     void)
 | |
| {
 | |
|     /* FIXME: Initialize the Clock Prescaler for ATmega8 */
 | |
| #if defined(__AVR_ATmega168__)
 | |
|     /* The default CLKPSx bits are factory set to 0011 */
 | |
|     /* Enbable the Clock Prescaler */
 | |
|     CLKPR = _BV(CLKPCE);
 | |
|     /* CLKPS3 CLKPS2 CLKPS1 CLKPS0 Clock Division Factor
 | |
|        ------ ------ ------ ------ ---------------------
 | |
|        0      0      0      0             1
 | |
|        0      0      0      1             2
 | |
|        0      0      1      0             4
 | |
|        0      0      1      1             8
 | |
|        0      1      0      0            16
 | |
|        0      1      0      1            32
 | |
|        0      1      1      0            64
 | |
|        0      1      1      1           128
 | |
|        1      0      0      0           256
 | |
|        1      x      x      x      Reserved
 | |
|      */
 | |
|     /* Set the CLKPS3..0 bits to Prescaler of 1 */
 | |
|     CLKPR = 0;
 | |
| #endif
 | |
|     /* Initialize I/O ports */
 | |
|     /* For Port DDRx (Data Direction) Input=0, Output=1 */
 | |
|     /* For Port PORTx (Bit Value) TriState=0, High=1 */
 | |
|     DDRB = 0;
 | |
|     PORTB = 0;
 | |
|     DDRC = 0;
 | |
|     PORTC = 0;
 | |
|     DDRD = 0;
 | |
|     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
 | |
| 
 | |
|     /* Configure Specialized Hardware */
 | |
|     RS485_Initialize();
 | |
|     RS485_Set_Baud_Rate(38400);
 | |
|     /* Configure Timer0 for millisecond timer */
 | |
|     timer_init();
 | |
|     /* Enable global interrupts */
 | |
|     __enable_interrupt();
 | |
| }
 | |
| 
 | |
| static uint8_t PDUBuffer[MAX_MPDU];
 | |
| 
 | |
| int main(
 | |
|     void)
 | |
| {
 | |
|     uint16_t pdu_len = 0;
 | |
|     BACNET_ADDRESS src; /* source address */
 | |
| 
 | |
|     init();
 | |
|     datalink_init(NULL);
 | |
|     for (;;) {
 | |
|         /* other tasks */
 | |
|         /* BACnet handling */
 | |
|         pdu_len = datalink_receive(&src, &PDUBuffer[0], sizeof(PDUBuffer), 0);
 | |
|         if (pdu_len) {
 | |
|             npdu_handler(&src, &PDUBuffer[0], pdu_len);
 | |
|         }
 | |
|     }
 | |
| }
 | 
