1

I updated this post on 8/23 to reflect the working solution.

I'm working with the c BACnet Stack on sourceforge. http://sourceforge.net/projects/bacnet/

I'm trying to modify the demo server included in the library. The server does almost exactly what I want it to, except that I need to connect it to some other c programs that I wrote.

My problem right now is that I can't figure out how to add my own c programs into the demo server. There are several nested Makefiles in the demo. I've tried adding my file into these Makefiles, but the compiler (gcc) doesn't like it.

The latest error is: No rule to make target ../../demo/object/test.o', needed bybacserv'. Stop.

I am not a c expert. I've been working with it my spare time for about a year. I understand the basics of a Makefile, but the Makefiles in this demo are apparently beyond me.

Is there anyone familiar with this library that might give me a little help?

Are there any better documentation than what is on the sourceforge website?

In this example I'm simply trying to add test.c to ai.c.

/demo/server/Makefile

OBJECT_SRC = \
    $(BACNET_OBJECT)/device.c \
    $(BACNET_OBJECT)/ai.c \
    $(BACNET_OBJECT)/ao.c \
    $(BACNET_OBJECT)/av.c \
    $(BACNET_OBJECT)/bi.c \
    $(BACNET_OBJECT)/bo.c \
    $(BACNET_OBJECT)/bv.c \
    $(BACNET_OBJECT)/csv.c \
    $(BACNET_OBJECT)/lc.c \
    $(BACNET_OBJECT)/lsp.c \
    $(BACNET_OBJECT)/ms-input.c \
    $(BACNET_OBJECT)/mso.c \
    $(BACNET_OBJECT)/msv.c \
    $(BACNET_OBJECT)/nc.c  \
    $(BACNET_OBJECT)/trendlog.c \
    $(BACNET_OBJECT)/test.c \      <-- New entry
    $(BACNET_OBJECT)/bacfile.c

/lib/Makefile

CORE_SRC = \
$(BACNET_CORE)/apdu.c \
$(BACNET_CORE)/npdu.c \
$(BACNET_CORE)/bacdcode.c \
$(BACNET_CORE)/bacint.c \
$(BACNET_CORE)/bacreal.c \
$(BACNET_CORE)/bacstr.c \
$(BACNET_CORE)/bacapp.c \
$(BACNET_CORE)/bacprop.c \
$(BACNET_CORE)/bactext.c \
$(BACNET_CORE)/datetime.c \
$(BACNET_CORE)/indtext.c \
$(BACNET_CORE)/key.c \
$(BACNET_CORE)/keylist.c \
$(BACNET_CORE)/proplist.c \
$(BACNET_CORE)/debug.c \
$(BACNET_CORE)/bigend.c \
$(BACNET_CORE)/arf.c \
$(BACNET_CORE)/awf.c \
$(BACNET_CORE)/cov.c \
$(BACNET_CORE)/dcc.c \
$(BACNET_CORE)/iam.c \
$(BACNET_CORE)/ihave.c \
$(BACNET_CORE)/rd.c \
$(BACNET_CORE)/rp.c \
$(BACNET_CORE)/rpm.c \
$(BACNET_CORE)/timesync.c \
$(BACNET_CORE)/whohas.c \
$(BACNET_CORE)/whois.c \
$(BACNET_CORE)/wp.c \
$(BACNET_CORE)/wpm.c \
$(BACNET_CORE)/abort.c \
$(BACNET_CORE)/reject.c \
$(BACNET_CORE)/bacerror.c \
$(BACNET_CORE)/ptransfer.c \
$(BACNET_CORE)/memcopy.c \
$(BACNET_CORE)/filename.c \
$(BACNET_CORE)/tsm.c \
$(BACNET_CORE)/bacaddr.c \
$(BACNET_CORE)/address.c \
$(BACNET_CORE)/bacdevobjpropref.c \
$(BACNET_CORE)/bacpropstates.c \
$(BACNET_CORE)/alarm_ack.c \
$(BACNET_CORE)/event.c \
$(BACNET_CORE)/getevent.c \
$(BACNET_CORE)/get_alarm_sum.c \
$(BACNET_CORE)/readrange.c \
$(BACNET_CORE)/timestamp.c \
$(BACNET_CORE)/test.c \               <-- Do not include test.c in this Makefile at all
$(BACNET_CORE)/version.c

new file locations:

test.c is located in /src             <-- Should be located in /demo/object
test.h is located in /include         <-- This works ok here

test.h

#ifndef _TEST_INCLUDE_
#define _TEST_INCLUDE_

void printit();

#endif

test.c

#include <stdio.h>                    <-- Needed to add #include <stdio.h>
#include "test.h"

void printit (){
    printf("it....");
}

/demo/object/ai.c

...
#include "handlers.h"
#include "timestamp.h"
#include "test.h"
#include "ai.h"
...
void Analog_Input_Init(
    void)
{
    unsigned i;
#if defined(INTRINSIC_REPORTING)
    unsigned j;
#endif
    printit(); //*****************************************************************
    for (i = 0; i < MAX_ANALOG_INPUTS; i++) {
        printf("Initializing AI:%u\n",i);
        AI_Descr[i].Present_Value = 0.0f;
        AI_Descr[i].Out_Of_Service = false;
        AI_Descr[i].Units = UNITS_PERCENT;
        AI_Descr[i].Reliability = RELIABILITY_NO_FAULT_DETECTED;
#if defined(INTRINSIC_REPORTING)
        AI_Descr[i].Event_State = EVENT_STATE_NORMAL;
        /* notification class not connected */
        AI_Descr[i].Notification_Class = BACNET_MAX_INSTANCE;
        /* initialize Event time stamps using wildcards
           and set Acked_transitions */
        for (j = 0; j < MAX_BACNET_EVENT_TRANSITION; j++) {
            datetime_wildcard_set(&AI_Descr[i].Event_Time_Stamps[j]);
            AI_Descr[i].Acked_Transitions[j].bIsAcked = true;
        }
        /* Set handler for GetEventInformation function */
        handler_get_event_information_set(OBJECT_ANALOG_INPUT,
            Analog_Input_Event_Information);
        /* Set handler for AcknowledgeAlarm function */
        handler_alarm_ack_set(OBJECT_ANALOG_INPUT, Analog_Input_Alarm_Ack);
        /* Set handler for GetAlarmSummary Service */
        handler_get_alarm_summary_set(OBJECT_ANALOG_INPUT,
            Analog_Input_Alarm_Summary);
#endif
    }
}
Timothy Vann
  • 2,537
  • 2
  • 20
  • 23

1 Answers1

1

I would say that your test.o cannot be made by gcc. The Makefile does specify to create it, though : .c.o: ${CC} -c ${CFLAGS} $*.c -o $@

I noticed that $(BACNET_OBJECT) in /demo/server/Makefile refers to the path /demo/object

You should try to add test.c there.

And i believe you don't need to add test.c in /lib/Makefile

Long time i didnt do any C, but didnt you forget to #include <stdio.h> for printf in test.c ?

Logar
  • 1,248
  • 9
  • 17
  • Logar, You were correct I needed to add #include to the top of test.c. I put test.c into /demo/object and I left test.h in /include. I then removed test.c from /lib/Makefile. It now works fine. Thank you. – – Timothy Vann Aug 23 '14 at 17:58
  • After using Logar's suggestions my additional file now works in both the ai.c and main.c files. However my new files that I will be adding are not objects and may not belong in the object directory. They are more like protocol translators. They probably belong in the /demo/server directory. I can't get test.c to work in the /demo/server directory. – Timothy Vann Aug 23 '14 at 18:26