Squashed commit of the following:

apps/examples/flowc:  Adds the necessary termios controls to enable hardware flow control

    apps/examples/flowc:  Add a simple test of serial hardware flow control.  This commit just defines the frame work.  Hardware flow control is not yet enabled.
This commit is contained in:
Gregory Nutt 2017-09-23 11:02:21 -06:00
parent 27773d570b
commit 267521af9b
11 changed files with 1019 additions and 0 deletions

View File

@ -428,6 +428,11 @@ examples/flash_test
internal OS interfaces and so is not available in the NUTTX kernel
builds
examples/flowc
^^^^^^^^^^^^^^
A simple test of serial hardware flow control.
examples/fstest
^^^^^^^^^^^^^^

16
examples/flowc/.gitignore vendored Normal file
View File

@ -0,0 +1,16 @@
/Make.dep
/.depend
/.built
/host
/config.h
/*.asm
/*.obj
/*.rel
/*.lst
/*.sym
/*.adb
/*.lib
/*.src
/*.exe
/*.dSYM
/*.hobj

93
examples/flowc/Kconfig Normal file
View File

@ -0,0 +1,93 @@
#
# For a description of the syntax of this configuration file,
# see the file kconfig-language.txt in the NuttX tools repository.
#
config EXAMPLES_FLOWC
bool "Serial flow control example"
default n
depends on SERIAL_TERMIOS
---help---
Enable the serial hardware flow control test
if EXAMPLES_FLOWC
config EXAMPLES_FLOWC_INPUT
bool "Verify input flow control"
default y
# depends on SERIAL_IFLOWCONTROL
config EXAMPLES_FLOWC_OUTPUT
bool "Verify output flow control"
default y
# depends on SERIAL_OFLOWCONTROL
config EXAMPLES_FLOWC_SENDER1
bool "Target1 is the sender"
default n
---help---
By default Target1 is the receiver and the host PC (or Target2) is
the sender. That is the configuration you would to test RX flow
control on the target.
config EXAMPLES_FLOWC_PROGNAME1
string "Target1 program name"
default "receiver" if !EXAMPLES_FLOWC_SENDER1
default "sender" if EXAMPLES_FLOWC_SENDER1
depends on BUILD_KERNEL
---help---
This is the name of the Target1 program that will be use when the
NSH ELF program is installed.
config EXAMPLES_FLOWC_PRIORITY1
int "Target1 task priority"
default 100
config EXAMPLES_FLOWC_STACKSIZE1
int "Target1 stack size"
default 2048
config EXAMPLES_FLOWC_TARGET2
bool "Second endpoint is a target"
default n
---help---
By default, the host PC is configured as the second endpoint of the
FLOWC test. If this option is selected, then the second endpoint
will be built into the FLASH image as well. This means that you
can use two target boards to run the test with no host PC
involvement.
if EXAMPLES_FLOWC_TARGET2
config EXAMPLES_FLOWC_PROGNAME2
string "Target2 program name"
default "receiver" if !EXAMPLES_FLOWC_RECEIVER2
default "sender" if EXAMPLES_FLOWC_RECEIVER2
depends on BUILD_KERNEL
---help---
This is the name of the Target2 program that will be use when the
NSH ELF program is installed.
config EXAMPLES_FLOWC_PRIORITY2
int "Target2 task priority"
default 100
config EXAMPLES_FLOWC_STACKSIZE2
int "Target2 stack size"
default 2048
endif # EXAMPLES_FLOWC_TARGET2
config EXAMPLES_FLOWC_RECEIVER_BUFSIZE
int "Receiver buffer size"
default 64
config EXAMPLES_FLOWC_RECEVER_DEVNAME
string "Default TTY device for receiver"
default "/dev/ttyACM0"
config EXAMPLES_FLOWC_SENDER_DEVNAME
string "Default TTY device for sender"
default "/dev/ttyACM0"
endif # EXAMPLES_FLOWC

39
examples/flowc/Make.defs Normal file
View File

@ -0,0 +1,39 @@
############################################################################
# apps/examples/flowc/Make.defs
# Adds selected applications to apps/ build
#
# Copyright (C) 2015 Gregory Nutt. All rights reserved.
# Author: Gregory Nutt <gnutt@nuttx.org>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in
# the documentation and/or other materials provided with the
# distribution.
# 3. Neither the name NuttX nor the names of its contributors may be
# used to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
############################################################################
ifeq ($(CONFIG_EXAMPLES_FLOWC),y)
CONFIGURED_APPS += examples/flowc
endif

235
examples/flowc/Makefile Normal file
View File

@ -0,0 +1,235 @@
############################################################################
# apps/examples/flowc/Makefile
#
# Copyright (C) 2007-2008, 2011-2012, 2014, 2017 Gregory Nutt. All rights reserved.
# Author: Gregory Nutt <gnutt@nuttx.org>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in
# the documentation and/or other materials provided with the
# distribution.
# 3. Neither the name NuttX nor the names of its contributors may be
# used to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
############################################################################
-include $(TOPDIR)/.config
-include $(TOPDIR)/Make.defs
include $(APPDIR)/Make.defs
# FLOWC Test
# Target 1
TARG1_CRCS =
ifeq ($(CONFIG_!EXAMPLES_FLOWC_SENDER1),y)
TARG1_CRCS += flowc_sender.c
else
TARG1_CRCS += flowc_receiver.c
endif
TARG1_MAINSRC = flowc_target1.c
TARG1_COBJS = $(TARG1_CRCS:.c=$(OBJEXT))
TARG1_MAINOBJ = $(TARG1_MAINSRC:.c=$(OBJEXT))
ifeq ($(CONFIG_!EXAMPLES_FLOWC_SENDER1),y)
CONFIG_EXAMPLES_FLOWC_PROGNAME1 ?= sender
APPNAME1 = sender
else
CONFIG_EXAMPLES_FLOWC_PROGNAME1 ?= receiver
APPNAME1 = receiver
endif
CONFIG_EXAMPLES_FLOWC_PRIORITY1 ?= 100
CONFIG_EXAMPLES_FLOWC_STACKSIZE1 ?= 2048
PROGNAME1 = $(CONFIG_EXAMPLES_FLOWC_PROGNAME1)
PRIORITY1 = $(CONFIG_EXAMPLES_FLOWC_PRIORITY1)
STACKSIZE1 = $(CONFIG_EXAMPLES_FLOWC_STACKSIZE1)
# Target 2
ifeq ($(CONFIG_EXAMPLES_FLOWC_TARGET2),y)
TARG2_CSRCS =
ifeq ($(CONFIG_!EXAMPLES_FLOWC_SENDER1),y)
TARG2_CSRCS += flowc_receiver.c
else
TARG2_CSRCS += flowc_sender.c
endif
TARG2_MAINSRC = flowc_target2.c
TARG2_COBJS = $(TARG2_CSRCS:.c=$(OBJEXT))
TARG2_MAINOBJ = $(TARG2_MAINSRC:.c=$(OBJEXT))
ifeq ($(CONFIG_!EXAMPLES_FLOWC_SENDER1),y)
CONFIG_EXAMPLES_FLOWC_PROGNAME2 ?= receiver
APPNAME2 = receiver
else
CONFIG_EXAMPLES_FLOWC_PROGNAME2 ?= sender
APPNAME2 = sender
endif
CONFIG_EXAMPLES_FLOWC_PRIORITY2 ?= 100
CONFIG_EXAMPLES_FLOWC_STACKSIZE2 ?= 2048
PROGNAME2 = $(CONFIG_EXAMPLES_FLOWC_PROGNAME2)
PRIORITY2 = $(CONFIG_EXAMPLES_FLOWC_PRIORITY2)
STACKSIZE2 = $(CONFIG_EXAMPLES_FLOWC_STACKSIZE2)
endif
TARG_SRCS = $(TARG1_CRCS) $(TARG1_MAINSRC) $(TARG2_CSRCS) $(TARG2_MAINSRC)
TARG_OBJS = $(TARG1_COBJS) $(TARG2_COBJS)
ifneq ($(CONFIG_BUILD_KERNEL),y)
TARG_OBJS += $(TARG1_MAINOBJ) $(TARG2_MAINOBJ)
endif
# Host
ifneq ($(CONFIG_EXAMPLES_FLOWC_TARGET2),y)
HOSTCFLAGS += -DEXAMPLES_FLOWC_HOST=1
HOSTOBJSEXT ?= hobj
HOST_SRCS = flowc_host.c
ifeq ($(CONFIG_!EXAMPLES_FLOWC_SENDER1),y)
HOST_SRCS += flowc_receiver.c
HOST_BIN = receiver$(EXEEXT)
else
HOST_SRCS += flowc_sender.c
HOST_BIN = sender$(EXEEXT)
endif
HOST_OBJS = $(HOST_SRCS:.c=.$(HOSTOBJSEXT))
endif
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
TARG_BIN = ..\..\libapps$(LIBEXT)
else
ifeq ($(WINTOOL),y)
TARG_BIN = ..\\..\\libapps$(LIBEXT)
else
TARG_BIN = ../../libapps$(LIBEXT)
endif
endif
ifeq ($(CONFIG_EXAMPLES_FLOWC_TARGET2),y)
MAINNAME1 = flowc1_main
MAINNAME2 = flowc2_main
else
MAINNAME1 = flowc_main
endif
ifeq ($(WINTOOL),y)
INSTALL_DIR = "${shell cygpath -w $(BIN_DIR)}"
else
INSTALL_DIR = $(BIN_DIR)
endif
ROOTDEPPATH = --dep-path .
# Common build
VPATH =
all: .built
.PHONY: clean depend distclean preconfig
.PRECIOUS: ../../libapps$(LIBEXT)
$(TARG1_COBJS) $(TARG1_MAINOBJ) $(TARG2_COBJS) $(TARG2_MAINOBJ): %$(OBJEXT): %.c
$(call COMPILE, $<, $@)
$(TARG_BIN): $(TARG_OBJS) $(HOST_BIN)
$(call ARCHIVE, $@, $(TARG_OBJS))
ifneq ($(CONFIG_EXAMPLES_FLOWC_TARGET2),y)
$(HOST_OBJS): %.$(HOSTOBJSEXT): %.c
@echo "CC: $<"
$(Q) $(HOSTCC) -c $(HOSTCFLAGS) $< -o $@
endif
config.h: $(TOPDIR)/include/nuttx/config.h
@echo "CP: $<"
$(Q) cp $< $@
ifneq ($(CONFIG_EXAMPLES_FLOWC_TARGET2),y)
$(HOST_BIN): config.h $(HOST_OBJS)
$(Q) $(HOSTCC) $(HOSTLDFLAGS) $(HOST_OBJS) -o $@
endif
.built: config.h $(TARG_BIN) $(HOST_BIN)
$(Q) touch .built
ifeq ($(CONFIG_BUILD_KERNEL),y)
$(BIN_DIR)$(DELIM)$(PROGNAME1): $(OBJS) $(TARG1_MAINOBJ)
@echo "LD: $(PROGNAME1)"
$(Q) $(LD) $(LDELFFLAGS) $(LDLIBPATH) -o $(INSTALL_DIR)$(DELIM)$(PROGNAME1) $(ARCHCRT0OBJ) $(TARG1_MAINOBJ) $(LDLIBS)
$(Q) $(NM) -u $(INSTALL_DIR)$(DELIM)$(PROGNAME1)
install: $(BIN_DIR)$(DELIM)$(PROGNAME1)
else
install:
endif
ifeq ($(CONFIG_NSH_BUILTIN_APPS),y)
$(BUILTIN_REGISTRY)$(DELIM)$(APPNAME1)_main.bdat: $(DEPCONFIG) Makefile
$(call REGISTER,$(APPNAME1),$(PRIORITY1),$(STACKSIZE1),$(MAINNAME1))
ifeq ($(CONFIG_EXAMPLES_FLOWC_TARGET2),y)
$(BUILTIN_REGISTRY)$(DELIM)$(APPNAME2)_main.bdat: $(DEPCONFIG) Makefile
$(call REGISTER,$(APPNAME2),$(PRIORITY2),$(STACKSIZE2),$(MAINNAME2))
context: $(BUILTIN_REGISTRY)$(DELIM)$(APPNAME1)_main.bdat \
$(BUILTIN_REGISTRY)$(DELIM)$(APPNAME2)_main.bdat
else
context: $(BUILTIN_REGISTRY)$(DELIM)$(APPNAME1)_main.bdat
endif
else
context:
endif
.depend: Makefile config.h $(TARG_SRCS)
@$(MKDEP) $(ROOTDEPPATH) "$(CC)" -- $(CFLAGS) -- $(TARG_SRCS) >Make.dep
@touch $@
depend: .depend
clean:
$(call DELFILE, .built)
ifneq ($(CONFIG_EXAMPLES_FLOWC_TARGET2),y)
$(call DELFILE, $(HOST_BIN))
$(call DELFILE, *.$(HOSTOBJSEXT))
endif
$(call DELFILE, *.dSYM)
$(call DELFILE, config.h)
$(call CLEAN)
distclean: clean
$(call DELFILE, Make.dep)
$(call DELFILE, .depend)
preconfig:
-include Make.dep

72
examples/flowc/flowc.h Normal file
View File

@ -0,0 +1,72 @@
/****************************************************************************
* examples/flowc/flowc.h
*
* Copyright (C) 2017 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
#ifndef __EXAMPLES_FLOWC_FLOWC_H
#define __EXAMPLES_FLOWC_FLOWC_H
/****************************************************************************
* Included Files
****************************************************************************/
#ifdef EXAMPLES_FLOWC_HOST
#else
# include <debug.h>
#endif
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
#ifdef EXAMPLES_FLOWC_HOST
# define FAR
#endif
#define MAX_DEVNAME 64
#define SENDSIZE (0x7f - 0x20)
#define NSENDS 1024
#define TOTALSIZE (NSENDS * SENDSIZE)
/****************************************************************************
* Public Data
****************************************************************************/
/****************************************************************************
* Public Function Prototypes
****************************************************************************/
int flowc_sender(int argc, char **argv);
int flowc_receiver(int argc, char **argv);
#endif /* __EXAMPLES_FLOWC_FLOWC_H */

View File

@ -0,0 +1,60 @@
/****************************************************************************
* examples/flowc/flowc_host.c
*
* Copyright (C) 2017 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name Gregory Nutt nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include "config.h"
#include "flowc.h"
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* main
****************************************************************************/
int main(int argc, char **argv, char **envp)
{
/* Run the receiver or sender, depending upon how target1 was configured */
#ifdef CONFIG_EXAMPLES_FLOWC_SENDER1
return flowc_receiver(argc, argv);
#else
return flowc_sender(argc, argv);
#endif
}

View File

@ -0,0 +1,198 @@
/****************************************************************************
* examples/flowc/flowc_receiver.c
*
* Copyright (C) 2017 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name Gregory Nutt nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include "config.h"
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <arpa/inet.h>
#include "flowc.h"
/****************************************************************************
* Public Data
****************************************************************************/
static char g_tty_devname[MAX_DEVNAME] = CONFIG_EXAMPLES_FLOWC_RECEVER_DEVNAME;
static char g_expected = 0x20;
static unsigned int g_nerrors;
static unsigned long g_count;
/****************************************************************************
* Private Functions
****************************************************************************/
static inline void check_buffer(FAR uint8_t *buf, size_t buflen)
{
unsigned long count;
FAR uint8_t *ptr;
size_t i;
int ch;
/* Verfiy the buffer content */
ch = g_expected;
for (i = 0, ptr = buf, count = g_count; i < buflen; i++, ptr++, count++)
{
if (*ptr != ch)
{
printf("receiver: ERROR: Expected %c (%02x), found %c (%02x) at count=%lu\n",
isprint(ch) ? ch : '.', ch,
isprint(*ptr) ? *ptr : '.', *ptr,
count);
g_nerrors++;
ch = *ptr;
}
}
/* Update globals */
g_expected = ch + 1;
if (g_expected > 0x7e)
{
g_expected = 0x20;
}
g_count = count;
}
/****************************************************************************
* flowc_cmdline
****************************************************************************/
static int flowc_cmdline(int argc, char **argv)
{
/* Currently only a single command line option is supported: The receiver
* IP address.
*/
if (argc == 2)
{
strncpy(g_tty_devname, argv[1], MAX_DEVNAME);
}
else if (argc != 1)
{
fprintf(stderr, "ERROR: Too many arguments\n");
fprintf(stderr, "USAGE: %s [<tty-devname>]\n", argv[0]);
return 1;
}
return 0;
}
/****************************************************************************
* Public Functions
****************************************************************************/
int flowc_receiver(int argc, char **argv)
{
uint8_t inbuf[CONFIG_EXAMPLES_FLOWC_RECEIVER_BUFSIZE];
#ifdef CONFIG_EXAMPLES_FLOWC_INPUT
struct termios term;
#endif
ssize_t nread;
int ret;
int fd;
/* Parse the command line */
ret = flowc_cmdline(argc, argv);
if (ret != 0)
{
return ret;
}
/* Open the serial device */
fd = open(g_tty_devname, O_RDONLY);
if (fd < 0)
{
printf("sender ERROR: Failed to open %s: %d\n", g_tty_devname, errno);
return 1;
}
#ifdef CONFIG_EXAMPLES_FLOWC_INPUT
/* Set input flow control */
tcgetattr(fd, &term);
#ifdef CRTS_IFLOW
term.c_cflag |= CRTS_IFLOW;
#else
term.c_cflag |= CRTSCTS;
#endif
tcsetattr(fd, TCSANOW, &term);
#endif
/* Then receive until all data has been received correctly (possibly
* hanging if data is lost).
*/
while (g_count < TOTALSIZE)
{
nread = read(fd, inbuf, CONFIG_EXAMPLES_FLOWC_RECEIVER_BUFSIZE);
if (nread < 0)
{
printf("receiver: %lu. recv failed: %d\n", g_count, errno);
close(fd);
return 1;
}
check_buffer(inbuf, nread);
if (g_nerrors > 25)
{
printf("receiver: %lu. Too many errors: %u\n", g_count, g_nerrors);
close(fd);
return 1;
}
}
close(fd);
return 0;
}

View File

@ -0,0 +1,171 @@
/****************************************************************************
* examples/flowc/flowc_sender.c
*
* Copyright (C) 2017 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name Gregory Nutt nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include "config.h"
#include <stdint.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <termios.h>
#include <string.h>
#include <errno.h>
#include "flowc.h"
/****************************************************************************
* Public Data
****************************************************************************/
static char g_tty_devname[MAX_DEVNAME] = CONFIG_EXAMPLES_FLOWC_SENDER_DEVNAME;
/****************************************************************************
* Private Functions
****************************************************************************/
static inline void fill_buffer(FAR uint8_t *buf)
{
FAR uint8_t *ptr;
int ch;
for (ch = 0x20; ch < 0x7f; ch++)
{
*ptr++ = ch;
}
}
/****************************************************************************
* flowc_cmdline
****************************************************************************/
static int flowc_cmdline(int argc, char **argv)
{
/* Currently only a single command line option is supported: The receiver
* IP address.
*/
if (argc == 2)
{
strncpy(g_tty_devname, argv[1], MAX_DEVNAME);
}
else if (argc != 1)
{
fprintf(stderr, "ERROR: Too many arguments\n");
fprintf(stderr, "USAGE: %s [<tty-devname>]\n", argv[0]);
return 1;
}
return 0;
}
/****************************************************************************
* Public Functions
****************************************************************************/
int flowc_sender(int argc, char **argv)
{
uint8_t outbuf[SENDSIZE];
#ifdef CONFIG_EXAMPLES_FLOWC_OUTPUT
struct termios term;
#endif
ssize_t nsent;
int ret;
int fd;
int i;
/* Parse the command line */
ret = flowc_cmdline(argc, argv);
if (ret != 0)
{
return ret;
}
/* Open the serial device */
fd = open(g_tty_devname, O_WRONLY);
if (fd < 0)
{
printf("sender ERROR: Failed to open %s: %d\n", g_tty_devname, errno);
return 1;
}
#ifdef CONFIG_EXAMPLES_FLOWC_OUTPUT
/* Set output flow control */
tcgetattr(fd, &term);
#ifdef CCTS_OFLOW
term.c_cflag |= CCTS_OFLOW;
#else
term.c_cflag |= CRTSCTS;
#endif
tcsetattr(fd, TCSANOW, &term);
#endif
/* Set up the output buffer */
fill_buffer(outbuf);
/* Then send the buffer multiple times as fast as possible */
for (i = 0; i < NSENDS; i++)
{
/* Send the message */
nsent = write(fd, outbuf, SENDSIZE);
if (nsent < 0)
{
printf("sender: %lu. write failed: %d\n",
(unsigned long)i*SENDSIZE, errno);
close(fd);
return 1;
}
else if (nsent != SENDSIZE)
{
printf("sender: %lu. Bad send length: %ld Expected: %d\n",
(unsigned long)i*SENDSIZE, (long)nsent, SENDSIZE);
close(fd);
return 1;
}
}
close(fd);
return 0;
}

View File

@ -0,0 +1,66 @@
/****************************************************************************
* examples/flowc/flowc_target1.c
*
* Copyright (C) 2017 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include "config.h"
#include "flowc.h"
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* flowc1_main
****************************************************************************/
#if defined(CONFIG_BUILD_KERNEL)
int main(int argc, FAR char *argv[])
#elif defined(CONFIG_EXAMPLES_FLOWC_TARGET2)
int flowc1_main(int argc, char *argv[])
#else
int flowc_main(int argc, char *argv[])
#endif
{
/* Run the receiver or sender, depending upon how we are configured */
#ifdef CONFIG_EXAMPLES_FLOWC_SENDER1
return flowc_sender(argc, argv);
#else
return flowc_receiver(argc, argv);
#endif
}

View File

@ -0,0 +1,64 @@
/****************************************************************************
* examples/flowc/flowc_target2.c
*
* Copyright (C) 2017 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include "config.h"
#include "flowc.h"
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* flowc2_main
****************************************************************************/
#if defined(CONFIG_BUILD_KERNEL)
int main(int argc, FAR char *argv[])
#else
int flowc2_main(int argc, char *argv[])
#endif
{
/* Run the receiver or sender, depending upon how target1 was configured */
#ifdef CONFIG_EXAMPLES_FLOWC_SENDER1
return flowc_receiver(argc, argv);
#else
return flowc_sender(argc, argv);
#endif
}