<?xml version="1.0" encoding="UTF-8"?>
<model version="4.5.1" links="0">
 <documentation>Simple Blinky example for QP/C++, which demonstrates:
- Active object (Blinky) with state machine
- Board Support Package abstraction for portability
- BSP implementation for desktop OS (Windows, Linux, Mac)
- Platform-independent main() function
- make.bat batch file for Windows</documentation>
 <framework name="qpcpp"/>
 <package name="AOs" stereotype="0x02">
  <class name="Mission" superclass="qpcpp::QActive">
   <attribute name="m_timeEvt" type="QP::QTimeEvt" visibility="0x02" properties="0x00"/>
   <operation name="Mission" type="" visibility="0x00" properties="0x00">
    <documentation>Blinky constructor</documentation>
    <code>  : QActive(Q_STATE_CAST(&amp;Blinky::initial)),
    m_timeEvt(this, TIMEOUT_SIG, 0U)</code>
   </operation>
   <statechart properties="0x00">
    <initial target="../1">
     <action>// arm the private time event to expire in 1/2s
// and periodically every 1/2 second
m_timeEvt.armX(BSP::TICKS_PER_SEC/2,
               BSP::TICKS_PER_SEC/2);
(void)e; // unused parameter</action>
     <initial_glyph conn="2,3,5,1,20,4,-4">
      <action box="0,-2,6,2"/>
     </initial_glyph>
    </initial>
    <state name="off">
     <entry>BSP::ledOff();</entry>
     <tran trig="TIMEOUT" target="../../2">
      <tran_glyph conn="2,13,3,1,18,6,-2">
       <action box="0,-2,8,2"/>
      </tran_glyph>
     </tran>
     <state_glyph node="2,5,16,10">
      <entry box="1,2,12,4"/>
     </state_glyph>
    </state>
    <state name="on">
     <entry>BSP::ledOn();</entry>
     <tran trig="TIMEOUT" target="../../1">
      <tran_glyph conn="2,25,3,1,20,-15,-4">
       <action box="0,-2,8,2"/>
      </tran_glyph>
     </tran>
     <state_glyph node="2,17,16,10">
      <entry box="1,2,12,4"/>
     </state_glyph>
    </state>
    <state_diagram size="30,29"/>
   </statechart>
  </class>
 </package>
 <directory name=".">
  <file name="CPF.cpp">
   <text>#include &quot;qpcpp.h&quot; // QP/C++ framework API
#include &quot;bsp.h&quot;   // Board Support Package interface

using namespace QP;

// ask QM to declare the Mission class ----------------------------------------
$declare${AOs::Mission}

// instantiate the Mission active object --------------------------------------
static Mission l_mission;
QActive * const AO_Mission = &amp;l_Mission;

// ask QM to define the Mission class (including the state machine) -----------
$define${AOs::Mission}</text>
  </file>
  <file name="bsp.h">
   <text>#ifndef BSP_H
#define BSP_H

// a very simple Board Support Package (BSP) -----========--------------------
class BSP {
public:
    enum { TICKS_PER_SEC = 100 }; // numer of clock ticks in a second
    static void init(void);
    static void ledOff(void);
    static void ledOn(void);
};

enum MissionSignals {
    TIMEOUT_SIG = QP::Q_USER_SIG, // offset the first signal
    MAX_SIG
};

// active object(s) used in this application -------------------------------
extern QP::QActive * const AO_Mission; // opaque pointer to the Blinky AO

#endif // BSP_H</text>
  </file>
  <file name="bsp.cpp">
   <text>#include &quot;qpcpp.h&quot;  // QP/C++ framework API
#include &quot;bsp.h&quot;    // Board Support Package interface
#include &lt;iostream&gt; // for cout/cerr
#include &lt;cstdlib&gt;  // for exit()

using namespace std;
using namespace QP;

void BSP::init(void)   {
    cout &lt;&lt; &quot;Simple Mission example\nQP/C++ version: &quot;
         &lt;&lt; QP_VERSION_STR
         &lt;&lt; &quot;\nPress Ctrl-C to quit...&quot;
         &lt;&lt; endl; // print QP version
}
void BSP::ledOff(void) { cout &lt;&lt; &quot;LED OFF&quot; &lt;&lt; endl; }
void BSP::ledOn(void)  { cout &lt;&lt; &quot;LED ON&quot; &lt;&lt; endl;  }

// callback functions needed by the framework --------------------------------
void QF::onStartup(void) {}
void QP::QF::onCleanup(void) {}
void QP::QF_onClockTick(void) {
    QF::TICK_X(0U, 0); // QF clock tick processing for rate 0
}
void Q_onAssert(char const * const module, int loc) {
    cerr &lt;&lt; &quot;Assertion failed in &quot; &lt;&lt;  module &lt;&lt; &quot;:&quot; &lt;&lt; loc &lt;&lt; endl;
    exit(-1);
}</text>
  </file>
  <file name="main.cpp">
   <text>#include &quot;qpcpp.h&quot; // QP/C++ framework API
#include &quot;bsp.h&quot;   // Board Support Package interface

using namespace QP;

// the main function ---------------------------------------------------------
int main() {
    QF::init();  // initialize the framework
    BSP::init(); // initialize the BSP

    // start the Mission active object
    static QEvt const *mission_queueSto[10]; // event queue buffer for Mission
    AO_Mission-&gt;start(1U, // priority of the active object
        mission_queueSto, // event queue buffer
        Q_DIM(mission_queueSto), // the length of the buffer
        (void *)0, 0U);  // private stack (not used on the desktop)

    return QF::run(); // let the framework run the application
}</text>
  </file>
  <file name="Makefile">
   <text># Makefile for building QP/C application on Windows and POSIX hosts
#
# examples of invoking this Makefile:
# building configurations: Debug (default), Release, and Spy
# make
# make CONF=rel
# make CONF=spy
# make clean   # cleanup the build
# make CONF=spy clean   # cleanup the build
#
# NOTE:
# To use this Makefile on Windows, you will need the GNU make utility, which
# is included in the QTools collection for Windows, see:
#    http://sourceforge.net/projects/qpc/files/QTools/
#

#-----------------------------------------------------------------------------
# project name:
#
PROJECT := CPF

#-----------------------------------------------------------------------------
# project directories:
#

# list of all source directories used by this project
VPATH := . \

# list of all include directories needed by this project
INCLUDES := -I. \

# location of the QP/C framework (if not provided in an env. variable)
ifeq ($(QPCPP),)
QPCPP := ../../..
endif

#-----------------------------------------------------------------------------
# project files:
#

# C source files...
C_SRCS :=

# C++ source files...
CPP_SRCS := \
    mission.cpp \
    bsp.cpp \
    main.cpp

LIB_DIRS  :=
LIBS      :=

# defines...
# QP_API_VERSION controls the QP API compatibility; 9999 means the latest API
DEFINES   := -DQP_API_VERSION=9999

ifeq (,$(CONF))
    CONF := dbg
endif

#-----------------------------------------------------------------------------
# add QP/C++ framework (depends on the OS this Makefile runs on):
#
ifeq ($(OS),Windows_NT)

# NOTE:
# For Windows hosts, you can choose:
# - the single-threaded QP/C++ port (win32-qv) or
# - the multithreaded QP/C++ port (win32).
#
QP_PORT_DIR := $(QPCPP)/ports/win32-qv
#QP_PORT_DIR := $(QPCPP)/ports/win32
LIB_DIRS += -L$(QP_PORT_DIR)/$(CONF)
LIBS     += -lqp -lws2_32

else

# NOTE:
# For POSIX hosts (Linux, MacOS), you can choose:
# - the single-threaded QP/C++ port (win32-qv) or
# - the multithreaded QP/C++ port (win32).
#
QP_PORT_DIR := $(QPCPP)/ports/posix-qv
#QP_PORT_DIR := $(QPCPP)/ports/posix

CPP_SRCS += \
    qep_hsm.cpp \
    qep_msm.cpp \
    qf_act.cpp \
    qf_actq.cpp \
    qf_defer.cpp \
    qf_dyn.cpp \
    qf_mem.cpp \
    qf_ps.cpp \
    qf_qact.cpp \
    qf_qeq.cpp \
    qf_qmact.cpp \
    qf_time.cpp \
    qf_port.cpp

QS_SRCS := \
    qs.cpp \
    qs_64bit.cpp \
    qs_rx.cpp \
    qs_fp.cpp \
    qs_port.cpp

LIBS += -lpthread

endif

#============================================================================
# Typically you should not need to change anything below this line

VPATH    += $(QPCPP)/src/qf $(QP_PORT_DIR)
INCLUDES += -I$(QPCPP)/include -I$(QPCPP)/src -I$(QP_PORT_DIR)

#-----------------------------------------------------------------------------
# GNU toolset:
#
# NOTE:
# GNU toolset (MinGW) is included in the QTools collection for Windows, see:
#     http://sourceforge.net/projects/qpc/files/QTools/
# It is assumed that %QTOOLS%\bin directory is added to the PATH
#
CC    := gcc
CPP   := g++
#LINK  := gcc    # for C programs
LINK  := g++   # for C++ programs

#-----------------------------------------------------------------------------
# basic utilities (depends on the OS this Makefile runs on):
#
ifeq ($(OS),Windows_NT)
    MKDIR      := mkdir
    RM         := rm
    TARGET_EXT := .exe
else ifeq ($(OSTYPE),cygwin)
    MKDIR      := mkdir -p
    RM         := rm -f
    TARGET_EXT := .exe
else
    MKDIR      := mkdir -p
    RM         := rm -f
    TARGET_EXT :=
endif

#-----------------------------------------------------------------------------
# build configurations...

ifeq (rel, $(CONF)) # Release configuration ..................................

BIN_DIR := build_rel
# gcc options:
CFLAGS  = -c -O3 -fno-pie -std=c99 -pedantic -Wall -Wextra -W \
    $(INCLUDES) $(DEFINES) -DNDEBUG

CPPFLAGS = -c -O3 -fno-pie -std=c++11 -pedantic -Wall -Wextra \
    -fno-rtti -fno-exceptions \
    $(INCLUDES) $(DEFINES) -DNDEBUG

else ifeq (spy, $(CONF))  # Spy configuration ................................

BIN_DIR := build_spy

CPP_SRCS += $(QS_SRCS)
VPATH    += $(QPCPP)/src/qs

# gcc options:
CFLAGS  = -c -g -O -fno-pie -std=c99 -pedantic -Wall -Wextra -W \
    $(INCLUDES) $(DEFINES) -DQ_SPY

CPPFLAGS = -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \
    -fno-rtti -fno-exceptions \
    $(INCLUDES) $(DEFINES) -DQ_SPY

else # default Debug configuration .........................................

BIN_DIR := build

# gcc options:
CFLAGS  = -c -g -O -fno-pie -std=c99 -pedantic -Wall -Wextra -W \
    $(INCLUDES) $(DEFINES)

CPPFLAGS = -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \
    -fno-rtti -fno-exceptions \
    $(INCLUDES) $(DEFINES)

endif  # .....................................................................

LINKFLAGS := -no-pie

#-----------------------------------------------------------------------------
C_OBJS       := $(patsubst %.c,%.o,   $(C_SRCS))
CPP_OBJS     := $(patsubst %.cpp,%.o, $(CPP_SRCS))

TARGET_EXE   := $(BIN_DIR)/$(PROJECT)$(TARGET_EXT)
C_OBJS_EXT   := $(addprefix $(BIN_DIR)/, $(C_OBJS))
C_DEPS_EXT   := $(patsubst %.o,%.d, $(C_OBJS_EXT))
CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS))
CPP_DEPS_EXT := $(patsubst %.o,%.d, $(CPP_OBJS_EXT))

# create $(BIN_DIR) if it does not exist
ifeq (&quot;$(wildcard $(BIN_DIR))&quot;,&quot;&quot;)
$(shell $(MKDIR) $(BIN_DIR))
endif

#-----------------------------------------------------------------------------
# rules
#

all: $(TARGET_EXE)

$(TARGET_EXE) : $(C_OBJS_EXT) $(CPP_OBJS_EXT)
    $(CPP) $(CPPFLAGS) $(QPCPP)/include/qstamp.cpp -o $(BIN_DIR)/qstamp.o
    $(LINK) $(LINKFLAGS) $(LIB_DIRS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS)

$(BIN_DIR)/%.d : %.c
    $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $&lt; &gt; $@

$(BIN_DIR)/%.d : %.cpp
    $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $&lt; &gt; $@

$(BIN_DIR)/%.o : %.c
    $(CC) $(CFLAGS) $&lt; -o $@

$(BIN_DIR)/%.o : %.cpp
    $(CPP) $(CPPFLAGS) $&lt; -o $@

.PHONY : clean show

# include dependency files only if our goal depends on their existence
ifneq ($(MAKECMDGOALS),clean)
  ifneq ($(MAKECMDGOALS),show)
-include $(C_DEPS_EXT) $(CPP_DEPS_EXT)
  endif
endif

.PHONY : clean show

clean :
    -$(RM) $(BIN_DIR)/*.o \
    $(BIN_DIR)/*.d \
    $(TARGET_EXE)

show :
    @echo PROJECT      = $(PROJECT)
    @echo TARGET_EXE   = $(TARGET_EXE)
    @echo VPATH        = $(VPATH)
    @echo C_SRCS       = $(C_SRCS)
    @echo CPP_SRCS     = $(CPP_SRCS)
    @echo C_DEPS_EXT   = $(C_DEPS_EXT)
    @echo C_OBJS_EXT   = $(C_OBJS_EXT)
    @echo C_DEPS_EXT   = $(C_DEPS_EXT)
    @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT)
    @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT)
    @echo LIB_DIRS     = $(LIB_DIRS)
    @echo LIBS         = $(LIBS)
    @echo DEFINES      = $(DEFINES)

</text>
  </file>
 </directory>
</model>
