diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..b787814 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,57 @@ +{ + "files.associations": { + "array": "cpp", + "string": "cpp", + "string_view": "cpp", + "ranges": "cpp", + "iostream": "cpp", + "cctype": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "atomic": "cpp", + "bit": "cpp", + "*.tcc": "cpp", + "compare": "cpp", + "concepts": "cpp", + "cstdint": "cpp", + "deque": "cpp", + "map": "cpp", + "set": "cpp", + "unordered_map": "cpp", + "vector": "cpp", + "exception": "cpp", + "algorithm": "cpp", + "functional": "cpp", + "iterator": "cpp", + "memory": "cpp", + "memory_resource": "cpp", + "numeric": "cpp", + "optional": "cpp", + "random": "cpp", + "system_error": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "utility": "cpp", + "fstream": "cpp", + "initializer_list": "cpp", + "iomanip": "cpp", + "iosfwd": "cpp", + "istream": "cpp", + "limits": "cpp", + "new": "cpp", + "ostream": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "streambuf": "cpp", + "cinttypes": "cpp", + "typeinfo": "cpp" + } +} \ No newline at end of file diff --git a/src/Client/Ultrasonic/Makefile b/src/Client/Ultrasonic/Makefile new file mode 100644 index 0000000..3d829be --- /dev/null +++ b/src/Client/Ultrasonic/Makefile @@ -0,0 +1,91 @@ +# +# 'make' build executable file 'main' +# 'make clean' removes all .o and executable files +# + +# define the Cpp compiler to use +CXX = g++ + +# define any compile-time flags +CXXFLAGS := -std=c++17 -Wall -Wextra -g -pthread -MD + +# define library paths in addition to /usr/lib +# if I wanted to include libraries not in /usr/lib I'd specify +# their path using -Lpath, something like: +LFLAGS = + +# define output directory +OUTPUT := output + +# define source directory +SRC := src + +# define include directory +INCLUDE := include + +# define lib directory +LIB := lib + +ifeq ($(OS),Windows_NT) +MAIN := main.exe +SOURCEDIRS := $(SRC) +INCLUDEDIRS := $(INCLUDE) +LIBDIRS := $(LIB) +FIXPATH = $(subst /,\,$1) +RM := del /q /f +MD := mkdir +else +MAIN := main +SOURCEDIRS := $(shell find $(SRC) -type d) +INCLUDEDIRS := $(shell find $(INCLUDE) -type d) +LIBDIRS := $(shell find $(LIB) -type d) +FIXPATH = $1 +RM = rm -f +MD := mkdir -p +endif + +# define any directories containing header files other than /usr/include +INCLUDES := $(patsubst %,-I%, $(INCLUDEDIRS:%/=%)) + +# define the C libs +LIBS := $(patsubst %,-L%, $(LIBDIRS:%/=%)) + +# define the C source files +SOURCES := $(wildcard $(patsubst %,%/*.cpp, $(SOURCEDIRS))) + +# define the C object files +OBJECTS := $(SOURCES:.cpp=.o) + +# +# The following part of the makefile is generic; it can be used to +# build any executable just by changing the definitions above and by +# deleting dependencies appended to the file from 'make depend' +# + +OUTPUTMAIN := $(call FIXPATH,$(OUTPUT)/$(MAIN)) + +all: $(OUTPUT) $(MAIN) + @echo Executing 'all' complete! + +$(OUTPUT): + $(MD) $(OUTPUT) + +$(MAIN): $(OBJECTS) + $(CXX) $(CXXFLAGS) $(INCLUDES) -o $(OUTPUTMAIN) $(OBJECTS) $(LFLAGS) $(LIBS) + +# this is a suffix replacement rule for building .o's from .c's +# it uses automatic variables $<: the name of the prerequisite of +# the rule(a .c file) and $@: the name of the target of the rule (a .o file) +# (see the gnu make manual section about automatic variables) +.cpp.o: + $(CXX) $(CXXFLAGS) $(INCLUDES) -c $< -o $@ + +.PHONY: clean +clean: + $(RM) $(OUTPUTMAIN) + $(RM) $(call FIXPATH,$(OBJECTS)) + @echo Cleanup complete! + +run: all + ./$(OUTPUTMAIN) + @echo Executing 'run: all' complete! \ No newline at end of file diff --git a/src/Client/Ultrasonic/Ultrasonic b/src/Client/Ultrasonic/Ultrasonic new file mode 100755 index 0000000..19b04af Binary files /dev/null and b/src/Client/Ultrasonic/Ultrasonic differ diff --git a/src/Client/Ultrasonic/Ultrasonic.cpp b/src/Client/Ultrasonic/Ultrasonic.cpp new file mode 100644 index 0000000..9b8a6f5 --- /dev/null +++ b/src/Client/Ultrasonic/Ultrasonic.cpp @@ -0,0 +1,80 @@ +#include "Ultrasonic.h" + +int main() { + // Open the serial port. Change device path as needed (currently set to an standard FTDI USB-UART cable type device) + int serial_port = open("/dev/ttyUSB0", O_RDWR); + + // Create new termios struct, we call it 'tty' for convention + struct termios tty; + + // Read in existing settings, and handle any error + if(tcgetattr(serial_port, &tty) != 0) { + printf("Error %i from tcgetattr: %s\n", errno, strerror(errno)); + return 1; + } + + tty.c_cflag &= ~PARENB; // Clear parity bit, disabling parity (most common) + tty.c_cflag &= ~CSTOPB; // Clear stop field, only one stop bit used in communication (most common) + tty.c_cflag &= ~CSIZE; // Clear all bits that set the data size + tty.c_cflag |= CS8; // 8 bits per byte (most common) + tty.c_cflag &= ~CRTSCTS; // Disable RTS/CTS hardware flow control (most common) + tty.c_cflag |= CREAD | CLOCAL; // Turn on READ & ignore ctrl lines (CLOCAL = 1) + + tty.c_lflag &= ~ICANON; + tty.c_lflag &= ~ECHO; // Disable echo + tty.c_lflag &= ~ECHOE; // Disable erasure + tty.c_lflag &= ~ECHONL; // Disable new-line echo + tty.c_lflag &= ~ISIG; // Disable interpretation of INTR, QUIT and SUSP + tty.c_iflag &= ~(IXON | IXOFF | IXANY); // Turn off s/w flow ctrl + tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL); // Disable any special handling of received bytes + + tty.c_oflag &= ~OPOST; // Prevent special interpretation of output bytes (e.g. newline chars) + tty.c_oflag &= ~ONLCR; // Prevent conversion of newline to carriage return/line feed + // tty.c_oflag &= ~OXTABS; // Prevent conversion of tabs to spaces (NOT PRESENT ON LINUX) + // tty.c_oflag &= ~ONOEOT; // Prevent removal of C-d chars (0x004) in output (NOT PRESENT ON LINUX) + + tty.c_cc[VTIME] = 10; // Wait for up to 1s (10 deciseconds), returning as soon as any data is received. + tty.c_cc[VMIN] = 0; + + // Set in/out baud rate to be 9600 + cfsetispeed(&tty, B9600); + cfsetospeed(&tty, B9600); + + // Save tty settings, also checking for error + if (tcsetattr(serial_port, TCSANOW, &tty) != 0) { + printf("Error %i from tcsetattr: %s\n", errno, strerror(errno)); + return 1; + } + + // Write to serial port + unsigned char msg[] = { 0x22, 0x00, 0x00, 0x22 }; + write(serial_port, msg, sizeof(msg)); + + // Allocate memory for read buffer, set size according to your needs + char read_buf [256]; + + // Normally you wouldn't do this memset() call, but since we will just receive + // ASCII data for this example, we'll set everything to 0 so we can + // call printf() easily. + memset(&read_buf, '\0', sizeof(read_buf)); + + // Read bytes. The behaviour of read() (e.g. does it block?, + // how long does it block for?) depends on the configuration + // settings above, specifically VMIN and VTIME + int num_bytes = read(serial_port, &read_buf, sizeof(read_buf)); + + // n is the number of bytes read. n may be 0 if no bytes were received, and can also be -1 to signal an error. + if (num_bytes < 0) { + printf("Error reading: %s", strerror(errno)); + return 1; + } + + + for (int i = 0; i < num_bytes; ++i) + std::cout << read_buf[i]; + std::cout << std::endl; + // printf("Read %i bytes. Received message: %s", num_bytes, read_buf); + + close(serial_port); + return 0; // success +}; \ No newline at end of file diff --git a/src/Client/Ultrasonic/Ultrasonic.d b/src/Client/Ultrasonic/Ultrasonic.d new file mode 100644 index 0000000..4060c79 --- /dev/null +++ b/src/Client/Ultrasonic/Ultrasonic.d @@ -0,0 +1,166 @@ +Ultrasonic: Ultrasonic.cpp /usr/include/stdc-predef.h Ultrasonic.h \ + /usr/include/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/lib/gcc/x86_64-linux-gnu/10/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/10/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/timesize.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/time64.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/cookie_io_functions_t.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h /usr/include/string.h \ + /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h \ + /usr/include/strings.h /usr/include/c++/10/iostream \ + /usr/include/x86_64-linux-gnu/c++/10/bits/c++config.h \ + /usr/include/x86_64-linux-gnu/c++/10/bits/os_defines.h \ + /usr/include/x86_64-linux-gnu/c++/10/bits/cpu_defines.h \ + /usr/include/c++/10/pstl/pstl_config.h /usr/include/c++/10/ostream \ + /usr/include/c++/10/ios /usr/include/c++/10/iosfwd \ + /usr/include/c++/10/bits/stringfwd.h \ + /usr/include/c++/10/bits/memoryfwd.h /usr/include/c++/10/bits/postypes.h \ + /usr/include/c++/10/cwchar /usr/include/wchar.h \ + /usr/include/x86_64-linux-gnu/bits/floatn.h \ + /usr/include/x86_64-linux-gnu/bits/floatn-common.h \ + /usr/include/x86_64-linux-gnu/bits/wchar.h \ + /usr/include/x86_64-linux-gnu/bits/types/wint_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/mbstate_t.h \ + /usr/include/c++/10/exception /usr/include/c++/10/bits/exception.h \ + /usr/include/c++/10/bits/exception_ptr.h \ + /usr/include/c++/10/bits/exception_defines.h \ + /usr/include/c++/10/bits/cxxabi_init_exception.h \ + /usr/include/c++/10/typeinfo /usr/include/c++/10/bits/hash_bytes.h \ + /usr/include/c++/10/new /usr/include/c++/10/bits/nested_exception.h \ + /usr/include/c++/10/bits/move.h /usr/include/c++/10/type_traits \ + /usr/include/c++/10/bits/char_traits.h \ + /usr/include/c++/10/bits/stl_algobase.h \ + /usr/include/c++/10/bits/functexcept.h \ + /usr/include/c++/10/bits/cpp_type_traits.h \ + /usr/include/c++/10/ext/type_traits.h \ + /usr/include/c++/10/ext/numeric_traits.h \ + /usr/include/c++/10/bits/stl_pair.h \ + /usr/include/c++/10/bits/stl_iterator_base_types.h \ + /usr/include/c++/10/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/10/bits/concept_check.h \ + /usr/include/c++/10/debug/assertions.h \ + /usr/include/c++/10/bits/stl_iterator.h \ + /usr/include/c++/10/bits/ptr_traits.h /usr/include/c++/10/debug/debug.h \ + /usr/include/c++/10/bits/predefined_ops.h /usr/include/c++/10/cstdint \ + /usr/lib/gcc/x86_64-linux-gnu/10/include/stdint.h /usr/include/stdint.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-intn.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h \ + /usr/include/c++/10/bits/localefwd.h \ + /usr/include/x86_64-linux-gnu/c++/10/bits/c++locale.h \ + /usr/include/c++/10/clocale /usr/include/locale.h \ + /usr/include/x86_64-linux-gnu/bits/locale.h /usr/include/c++/10/cctype \ + /usr/include/ctype.h /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endianness.h \ + /usr/include/c++/10/bits/ios_base.h /usr/include/c++/10/ext/atomicity.h \ + /usr/include/x86_64-linux-gnu/c++/10/bits/gthr.h \ + /usr/include/x86_64-linux-gnu/c++/10/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \ + /usr/include/x86_64-linux-gnu/bits/sched.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h \ + /usr/include/x86_64-linux-gnu/bits/cpu-set.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/bits/timex.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \ + /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_tm.h \ + /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/timer_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ + /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \ + /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \ + /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h \ + /usr/include/x86_64-linux-gnu/bits/setjmp.h \ + /usr/include/x86_64-linux-gnu/c++/10/bits/atomic_word.h \ + /usr/include/c++/10/bits/locale_classes.h /usr/include/c++/10/string \ + /usr/include/c++/10/bits/allocator.h \ + /usr/include/x86_64-linux-gnu/c++/10/bits/c++allocator.h \ + /usr/include/c++/10/ext/new_allocator.h \ + /usr/include/c++/10/bits/ostream_insert.h \ + /usr/include/c++/10/bits/cxxabi_forced.h \ + /usr/include/c++/10/bits/stl_function.h \ + /usr/include/c++/10/backward/binders.h \ + /usr/include/c++/10/bits/range_access.h \ + /usr/include/c++/10/initializer_list \ + /usr/include/c++/10/bits/iterator_concepts.h \ + /usr/include/c++/10/concepts /usr/include/c++/10/bits/range_cmp.h \ + /usr/include/c++/10/bits/basic_string.h \ + /usr/include/c++/10/ext/alloc_traits.h \ + /usr/include/c++/10/bits/alloc_traits.h \ + /usr/include/c++/10/bits/stl_construct.h /usr/include/c++/10/string_view \ + /usr/include/c++/10/bits/functional_hash.h \ + /usr/include/c++/10/bits/string_view.tcc \ + /usr/include/c++/10/ext/string_conversions.h /usr/include/c++/10/cstdlib \ + /usr/include/stdlib.h /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ + /usr/include/x86_64-linux-gnu/sys/types.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/bits/uintn-identity.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \ + /usr/include/alloca.h /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ + /usr/include/c++/10/bits/std_abs.h /usr/include/c++/10/cstdio \ + /usr/include/c++/10/cerrno /usr/include/errno.h \ + /usr/include/x86_64-linux-gnu/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/x86_64-linux-gnu/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/x86_64-linux-gnu/bits/types/error_t.h \ + /usr/include/c++/10/bits/charconv.h \ + /usr/include/c++/10/bits/basic_string.tcc \ + /usr/include/c++/10/bits/locale_classes.tcc \ + /usr/include/c++/10/system_error \ + /usr/include/x86_64-linux-gnu/c++/10/bits/error_constants.h \ + /usr/include/c++/10/stdexcept /usr/include/c++/10/streambuf \ + /usr/include/c++/10/bits/streambuf.tcc \ + /usr/include/c++/10/bits/basic_ios.h \ + /usr/include/c++/10/bits/locale_facets.h /usr/include/c++/10/cwctype \ + /usr/include/wctype.h /usr/include/x86_64-linux-gnu/bits/wctype-wchar.h \ + /usr/include/x86_64-linux-gnu/c++/10/bits/ctype_base.h \ + /usr/include/c++/10/bits/streambuf_iterator.h \ + /usr/include/x86_64-linux-gnu/c++/10/bits/ctype_inline.h \ + /usr/include/c++/10/bits/locale_facets.tcc \ + /usr/include/c++/10/bits/basic_ios.tcc \ + /usr/include/c++/10/bits/ostream.tcc /usr/include/c++/10/istream \ + /usr/include/c++/10/bits/istream.tcc /usr/include/fcntl.h \ + /usr/include/x86_64-linux-gnu/bits/fcntl.h \ + /usr/include/x86_64-linux-gnu/bits/fcntl-linux.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_iovec.h \ + /usr/include/linux/falloc.h /usr/include/x86_64-linux-gnu/bits/stat.h \ + /usr/include/termios.h /usr/include/x86_64-linux-gnu/bits/termios.h \ + /usr/include/x86_64-linux-gnu/bits/termios-struct.h \ + /usr/include/x86_64-linux-gnu/bits/termios-c_cc.h \ + /usr/include/x86_64-linux-gnu/bits/termios-c_iflag.h \ + /usr/include/x86_64-linux-gnu/bits/termios-c_oflag.h \ + /usr/include/x86_64-linux-gnu/bits/termios-baud.h \ + /usr/include/x86_64-linux-gnu/bits/termios-c_cflag.h \ + /usr/include/x86_64-linux-gnu/bits/termios-c_lflag.h \ + /usr/include/x86_64-linux-gnu/bits/termios-tcflow.h \ + /usr/include/x86_64-linux-gnu/bits/termios-misc.h \ + /usr/include/x86_64-linux-gnu/sys/ttydefaults.h /usr/include/unistd.h \ + /usr/include/x86_64-linux-gnu/bits/posix_opt.h \ + /usr/include/x86_64-linux-gnu/bits/environments.h \ + /usr/include/x86_64-linux-gnu/bits/confname.h \ + /usr/include/x86_64-linux-gnu/bits/getopt_posix.h \ + /usr/include/x86_64-linux-gnu/bits/getopt_core.h \ + /usr/include/x86_64-linux-gnu/bits/unistd_ext.h diff --git a/src/Client/Ultrasonic/Ultrasonic.h b/src/Client/Ultrasonic/Ultrasonic.h new file mode 100644 index 0000000..176078c --- /dev/null +++ b/src/Client/Ultrasonic/Ultrasonic.h @@ -0,0 +1,11 @@ +// C library headers +#include +#include +#include + +// Linux headers +#include // Contains file controls like O_RDWR +#include // Error integer and strerror() function +#include // Contains POSIX terminal control definitions +#include // write(), read(), close() +