void main( void) { RCONbits.NOT_POR = 1; RCONbits.NOT_RI = 1; Hardware_Initialize(); Initialize_Variables(); /* initialize BACnet Data Link Layer */ dlmstp_set_my_address(42); dlmstp_set_max_info_frames(1); dlmstp_set_max_master(127); RS485_Set_Baud_Rate(38400); dlmstp_init(); /* Handle anything that needs to be done on powerup */ /* Greet the BACnet world! */ Send_I_Am(&Handler_Transmit_Buffer[0]); /* Main loop */ while (TRUE) { RESTART_WDT(); dlmstp_task(); MainTasks(); Global_Int(INT_ENABLED); ENABLE_TIMER4_INT(); } }
void dlmstp_reinit( void) { RS485_Reinit(); dlmstp_set_my_address(DEFAULT_MAC_ADDRESS); dlmstp_set_max_info_frames(DEFAULT_MAX_INFO_FRAMES); dlmstp_set_max_master(DEFAULT_MAX_MASTER); }
int main( int argc, char *argv[]) { BACNET_ADDRESS src = { 0 }; /* address where message came from */ uint16_t pdu_len = 0; unsigned timeout = 100; /* milliseconds */ (void) argc; (void) argv; Device_Set_Object_Instance_Number(126); Init_Service_Handlers(); RTOS_Initialize(); /* init the physical layer */ #ifdef BACDL_MSTP dlmstp_set_my_address(0x05); #endif datalink_init(NULL); Send_I_Am(&Handler_Transmit_Buffer[0]); /* loop forever */ for (;;) { /* input */ /* returns 0 bytes on timeout */ pdu_len = datalink_receive(&src, &Rx_Buf[0], MAX_MPDU, timeout); /* process */ if (pdu_len) { npdu_handler(&src, &Rx_Buf[0], pdu_len); } /* output */ /* blink LEDs, Turn on or off outputs, etc */ } }
bool dlmstp_init( char *ifname) { unsigned long hThread = 0; int rv = 0; /* initialize packet queue */ Receive_Packet.ready = false; Receive_Packet.pdu_len = 0; rv = pthread_cond_init(&Receive_Packet_Flag, NULL); if (rv == -1) { fprintf(stderr, "MS/TP Interface: %s\n cannot allocate PThread Condition.\n", ifname); exit(1); } rv = pthread_cond_init(&Received_Frame_Flag, NULL); if (rv == -1) { fprintf(stderr, "MS/TP Interface: %s\n cannot allocate PThread Condition.\n", ifname); exit(1); } rv = pthread_mutex_init(&Receive_Packet_Mutex, NULL); if (rv == -1) { fprintf(stderr, "MS/TP Interface: %s\n cannot allocate PThread Mutex.\n", ifname); exit(1); } rv = pthread_mutex_init(&Received_Frame_Mutex, NULL); if (rv == -1) { fprintf(stderr, "MS/TP Interface: %s\n cannot allocate PThread Mutex.\n", ifname); exit(1); } /* initialize hardware */ if (ifname) { RS485_Set_Interface(ifname); #if PRINT_ENABLED fprintf(stderr, "MS/TP Interface: %s\n", ifname); #endif } RS485_Initialize(); MSTP_Port.InputBuffer = &RxBuffer[0]; MSTP_Port.InputBufferSize = sizeof(RxBuffer); MSTP_Port.OutputBuffer = &TxBuffer[0]; MSTP_Port.OutputBufferSize = sizeof(TxBuffer); MSTP_Port.SilenceTimer = Timer_Silence; MSTP_Port.SilenceTimerReset = Timer_Silence_Reset; MSTP_Init(&MSTP_Port); #if 0 uint8_t data; /* FIXME: implement your data storage */ data = 64; /* I2C_Read_Byte( EEPROM_DEVICE_ADDRESS, EEPROM_MSTP_MAC_ADDR); */ if (data <= 127) MSTP_Port.This_Station = data; else dlmstp_set_my_address(DEFAULT_MAC_ADDRESS); /* FIXME: implement your data storage */ data = 127; /* I2C_Read_Byte( EEPROM_DEVICE_ADDRESS, EEPROM_MSTP_MAX_MASTER_ADDR); */ if ((data <= 127) && (data >= MSTP_Port.This_Station)) MSTP_Port.Nmax_master = data; else dlmstp_set_max_master(DEFAULT_MAX_MASTER); /* FIXME: implement your data storage */ data = 1; /* I2C_Read_Byte( EEPROM_DEVICE_ADDRESS, EEPROM_MSTP_MAX_INFO_FRAMES_ADDR); */ if (data >= 1) MSTP_Port.Nmax_info_frames = data; else dlmstp_set_max_info_frames(DEFAULT_MAX_INFO_FRAMES); #endif #if PRINT_ENABLED fprintf(stderr, "MS/TP MAC: %02X\n", MSTP_Port.This_Station); fprintf(stderr, "MS/TP Max_Master: %02X\n", MSTP_Port.Nmax_master); fprintf(stderr, "MS/TP Max_Info_Frames: %u\n", MSTP_Port.Nmax_info_frames); #endif /* start the threads */ rv = pthread_create(&hThread, NULL, dlmstp_milliseconds_task, NULL); if (rv != 0) { fprintf(stderr, "Failed to start timer task\n"); } rv = pthread_create(&hThread, NULL, dlmstp_receive_fsm_task, NULL); if (rv != 0) { fprintf(stderr, "Failed to start recive FSM task\n"); } rv = pthread_create(&hThread, NULL, dlmstp_master_fsm_task, NULL); if (rv != 0) { fprintf(stderr, "Failed to start Master Node FSM task\n"); } return true; }
bool dlmstp_init( char *ifname) { unsigned long hThread = 0; uint32_t arg_value = 0; TIMECAPS tc; /* initialize packet queue */ Receive_Packet.ready = false; Receive_Packet.pdu_len = 0; Receive_Packet_Flag = CreateSemaphore(NULL, 0, 1, "dlmstpReceivePacket"); if (Receive_Packet_Flag == NULL) exit(1); Received_Frame_Flag = CreateSemaphore(NULL, 0, 1, "dlsmtpReceiveFrame"); if (Received_Frame_Flag == NULL) { CloseHandle(Receive_Packet_Flag); exit(1); } /* initialize hardware */ /* initialize hardware */ if (ifname) { RS485_Set_Interface(ifname); #if PRINT_ENABLED fprintf(stderr, "MS/TP Interface: %s\n", ifname); #endif } RS485_Initialize(); MSTP_Port.InputBuffer = &RxBuffer[0]; MSTP_Port.InputBufferSize = sizeof(RxBuffer); MSTP_Port.OutputBuffer = &TxBuffer[0]; MSTP_Port.OutputBufferSize = sizeof(TxBuffer); MSTP_Port.SilenceTimer = Timer_Silence; MSTP_Port.SilenceTimerReset = Timer_Silence_Reset; MSTP_Init(&MSTP_Port); #if 0 uint8_t data; /* FIXME: implement your data storage */ data = 64; /* I2C_Read_Byte( EEPROM_DEVICE_ADDRESS, EEPROM_MSTP_MAC_ADDR); */ if (data <= 127) MSTP_Port.This_Station = data; else dlmstp_set_my_address(DEFAULT_MAC_ADDRESS); /* FIXME: implement your data storage */ data = 127; /* I2C_Read_Byte( EEPROM_DEVICE_ADDRESS, EEPROM_MSTP_MAX_MASTER_ADDR); */ if ((data <= 127) && (data >= MSTP_Port.This_Station)) MSTP_Port.Nmax_master = data; else dlmstp_set_max_master(DEFAULT_MAX_MASTER); /* FIXME: implement your data storage */ data = 1; /* I2C_Read_Byte( EEPROM_DEVICE_ADDRESS, EEPROM_MSTP_MAX_INFO_FRAMES_ADDR); */ if (data >= 1) MSTP_Port.Nmax_info_frames = data; else dlmstp_set_max_info_frames(DEFAULT_MAX_INFO_FRAMES); #endif #if PRINT_ENABLED fprintf(stderr, "MS/TP MAC: %02X\n", MSTP_Port.This_Station); fprintf(stderr, "MS/TP Max_Master: %02X\n", MSTP_Port.Nmax_master); fprintf(stderr, "MS/TP Max_Info_Frames: %u\n", MSTP_Port.Nmax_info_frames); #endif /* set timer resolution */ if (timeGetDevCaps(&tc, sizeof(TIMECAPS)) != TIMERR_NOERROR) { fprintf(stderr, "Failed to set timer resolution\n"); } TimeBeginPeriod = min(max(tc.wPeriodMin, TARGET_RESOLUTION), tc.wPeriodMax); timeBeginPeriod(TimeBeginPeriod); /* start the threads */ hThread = _beginthread(dlmstp_receive_fsm_task, 4096, &arg_value); if (hThread == 0) { fprintf(stderr, "Failed to start recive FSM task\n"); } hThread = _beginthread(dlmstp_master_fsm_task, 4096, &arg_value); if (hThread == 0) { fprintf(stderr, "Failed to start Master Node FSM task\n"); } return true; }