diff --git a/groundStation/Makefile b/groundStation/Makefile index 372c220dc0c1cb8b672b19c8f2b5e2fea8db2d2c..a8ed46cfb380bd390467c1bf33f7c8cf8b5daae7 100644 --- a/groundStation/Makefile +++ b/groundStation/Makefile @@ -6,7 +6,7 @@ GXX=g++ CFLAGS= -Wall -Wpedantic -Wextra -Werror -std=c99 -g -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-but-set-variable CXXFLAGS= -Wall -Wpedantic -Wextra -Werror -Wno-reorder -Wno-unused-variable -std=c++0x -g INCLUDES = $(foreach dir, $(INCDIR), -I$(dir)) -INCDIR=inc src/vrpn src/vrpn/quat src/vrpn/build $(BESRCDIR) $(CLISRCDIR) +INCDIR=inc src/vrpn src/vrpn/quat src/vrpn/build $(BESRCDIR) $(CLISRCDIR) $(FESRCDIR) LIBS= -lpthread -lbluetooth -lvrpn -lquat -Lsrc/vrpn/build -Lsrc/vrpn/build/quat OBJDIR=obj @@ -24,8 +24,13 @@ CLISOURCES := $(wildcard $(CLISRCDIR)/*.c ) CLIOBJECTS = $(CLISOURCES:$(CLISRCDIR)/%.c=$(OBJDIR)/%.o) CLIBINARIES = $(notdir $(patsubst %.c,%,$(CLISOURCES))) +# Frontend-common stuff +FESRCDIR=src/frontend +FECSOURCES := $(wildcard $(FESRCDIR)/*.c ) +FECOBJECTS = $(FECSOURCES:$(FESRCDIR)/%.c=$(OBJDIR)/%.o) -OBJECTS= $(CLIOBJECTS) $(BECOBJECTS) $(BECPPOBJECTS) + +OBJECTS= $(CLIOBJECTS) $(BECOBJECTS) $(BECPPOBJECTS) $(FECOBJECTS) # Default target all: logs objdir backend cli @@ -34,13 +39,16 @@ vrpn: vrpn/build cli: $(CLIBINARIES) -$(CLIBINARIES): % : $(CLISRCDIR)/%.c - $(GCC) $(CFLAGS) $< -o $@ $(INCLUDES) $(LIBS) +$(CLIBINARIES): % : $(CLISRCDIR)/%.c $(FECOBJECTS) + $(GCC) $(CFLAGS) $< -o $@ $(INCLUDES) $(LIBS) $(FECOBJECTS) backend: $(BECPPOBJECTS) $(BECOBJECTS) $(GXX) $(CXXFLAGS) $^ -o $(BEBINARY) $(INCLUDES) $(LIBS) +$(FECOBJECTS) : $(OBJDIR)/%.o : $(FESRCDIR)/%.c + $(GCC) $(CFLAGS) -c $^ -o $@ $(INCLUDES) $(LIBS) + $(BECOBJECTS) : $(OBJDIR)/%.o : $(BESRCDIR)/%.c $(GCC) $(CFLAGS) -c $^ -o $@ $(INCLUDES) $(LIBS) @@ -64,4 +72,4 @@ clean: rm -rf $(OBJDIR)/ $(BEBINARY) $(CLIBINARIES) debug: - @echo $(CLIBINARIES) \ No newline at end of file + @echo $(CLIBINARIES) diff --git a/groundStation/src/frontend/frontend_common.c b/groundStation/src/frontend/frontend_common.c index fb343ebf89629b6147d24927dc817bc584703c17..adffae8defb05d3fda075a986f35846062a573a3 100644 --- a/groundStation/src/frontend/frontend_common.c +++ b/groundStation/src/frontend/frontend_common.c @@ -1 +1,79 @@ -#include < +#define _GNU_SOURCE + +#include "frontend_common.h" +#include "config.h" + +#include <string.h> +#include <stdio.h> +#include <stdlib.h> +#include <errno.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <sys/un.h> +#include <unistd.h> +#include <err.h> + +struct backend_conn { + FILE * socket; + + size_t len; + char * buf; +}; + +struct backend_conn * ucart_backendConnect() +{ + int s; + struct sockaddr_un remote; + char str[100]; + + if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { + perror("socket"); + exit(1); + } + + struct backend_conn * conn = NULL; + + printf("Trying to connect...\n"); + + remote.sun_family = AF_UNIX; + char * sock_env = getenv(SOCKET_ENV); + strcpy(remote.sun_path, sock_env ? sock_env : DEFAULT_SOCKET); + if (connect(s, (struct sockaddr *)&remote, sizeof(remote)) == -1) { + perror("connect"); + goto fail_final; + } + + conn = malloc(sizeof(struct backend_conn)); + if (conn == NULL) { + perror("malloc"); + goto fail_sock; + } + + conn->len = 0; + conn->buf = NULL; + conn->socket = fdopen(s, "rw"); + if (conn->socket == NULL) { + perror("fdopen"); + goto fail_malloc_conn; + } + + /* success */ + goto fail_final; + +fail_malloc_conn: + free(conn); + conn = NULL; +fail_sock: + close(s); +fail_final: + return conn; +} + +void ucart_backendDisconnect(struct backend_conn * conn) +{ + fclose(conn->socket); + if (conn->buf) { + free(conn->buf); + } + free(conn); +} diff --git a/groundStation/src/frontend/frontend_common.h b/groundStation/src/frontend/frontend_common.h index e468b618f651d212a38019421f2eb2cbf7cd7a5b..28405f194168e7825d07cbe367213cb105fadd83 100644 --- a/groundStation/src/frontend/frontend_common.h +++ b/groundStation/src/frontend/frontend_common.h @@ -4,13 +4,14 @@ struct backend_conn; /* Start connection to quad */ -struct backend_conn * ucart_backendConnect(); +struct backend_conn * ucart_backendConnect(void); /* Stop connection to quad */ void ucart_backendDisconnect(struct backend_conn * conn); -/* Get a string from the backend. NOTE: free() the string when - * you are done with it. +/* Get a line from the backend. + * + * The line will remain valid until the next call to ucart_backendGetline. */ char * ucart_backendGetline(struct backend_conn * conn);