From 5620ee410e842512d1e210f6a18dec7838974111 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Tue, 3 May 2011 10:37:42 +0000 Subject: added dtmftest git-svn-id: https://svn.spreadspace.org/mur.sat@9 7de4ea59-55d0-425e-a1af-a3118ea81d4c --- software/tests/dtmf/Makefile | 72 ++++++++++++++ software/tests/dtmf/dtmftest.c | 213 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 285 insertions(+) create mode 100644 software/tests/dtmf/Makefile create mode 100644 software/tests/dtmf/dtmftest.c (limited to 'software') diff --git a/software/tests/dtmf/Makefile b/software/tests/dtmf/Makefile new file mode 100644 index 0000000..5485fc1 --- /dev/null +++ b/software/tests/dtmf/Makefile @@ -0,0 +1,72 @@ +## +## mur.sat +## +## Somewhen in the year 2011, mur.at will have a nano satellite launched +## into a low earth orbit (310 km above the surface of our planet). The +## satellite itself is a TubeSat personal satellite kit, developed and +## launched by interorbital systems. mur.sat is a joint venture of mur.at, +## ESC im Labor and realraum. +## +## Please visit the project hompage at sat.mur.at for further information. +## +## +## Copyright (C) 2011 Christian Pointner +## +## This file is part of mur.sat. +## +## mur.sat is free software: you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## any later version. +## +## mur.sat is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with mur.sat. If not, see . +## + +GST_CFLAGS=$(shell pkg-config --cflags gstreamer-0.10) +GST_LDFLAGS=$(shell pkg-config --libs gstreamer-0.10) + +CC := gcc +CFLAGS := -g -O2 $(GST_CFLAGS) +LDFLAGS := -g -Wall -O2 $(GST_LDFLAGS) +STRIP := strip + +EXECUTABLE := dtmftest + +C_OBJS := dtmftest.o + +C_SRCS := $(C_OBJS:%.o=%.c) + +.PHONY: clean + +all: $(EXECUTABLE) + +%.d: %.c + @set -e; rm -f $@; \ + $(CC) -MM $(CFLAGS) $< > $@.$$$$; \ + sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \ + rm -f $@.$$$$; echo '(re)building $@' + +ifneq ($(MAKECMDGOALS),distclean) +-include $(C_SRCS:%.c=%.d) +endif + +$(EXECUTABLE): $(C_OBJS) + $(CC) $(C_OBJS) -o $@ $(LDFLAGS) + +%.o: %.c + $(CC) $(CFLAGS) -c $< + +strip: $(EXECUTABLE) + $(STRIP) -s $(EXECUTABLE) + +clean: + rm -f *.o + rm -f *.d + rm -f *.d.* + rm -f $(EXECUTABLE) diff --git a/software/tests/dtmf/dtmftest.c b/software/tests/dtmf/dtmftest.c new file mode 100644 index 0000000..e648598 --- /dev/null +++ b/software/tests/dtmf/dtmftest.c @@ -0,0 +1,213 @@ +/* + * mur.sat + * + * Somewhen in the year 2011, mur.at will have a nano satellite launched + * into a low earth orbit (310 km above the surface of our planet). The + * satellite itself is a TubeSat personal satellite kit, developed and + * launched by interorbital systems. mur.sat is a joint venture of mur.at, + * ESC im Labor and realraum. + * + * Please visit the project hompage at sat.mur.at for further information. + * + * + * Copyright (C) 2011 Christian Pointner + * + * This file is part of mur.sat. + * + * mur.sat is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * mur.sat is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with mur.sat. If not, see . + */ +#include +#include +#include +#include +#include +#include +#include + +static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data) +{ + GMainLoop *loop = (GMainLoop *) data; + + switch (GST_MESSAGE_TYPE (msg)) { + + case GST_MESSAGE_EOS: + g_print ("End of stream\n"); + g_main_loop_quit (loop); + break; + + case GST_MESSAGE_ERROR: { + gchar *debug; + GError *error; + + gst_message_parse_error (msg, &error, &debug); + g_free (debug); + + g_printerr ("Error: %s\n", error->message); + g_error_free (error); + + g_main_loop_quit (loop); + break; + } + default: + break; + } + + return TRUE; +} + + +struct thread_param { + GstElement* element; + GMainLoop* loop; +}; + +static GThread *reader_thread; + +static gpointer reader_thread_func(gpointer data) +{ + struct thread_param* param = (struct thread_param *)data; + + GMainLoop* loop = param->loop; + GstElement* element = param->element; + free(param); + + printf("reader thread started\n"); + + struct termios tio; + + tcgetattr(fileno(stdin), &tio); + tio.c_lflag &= ~ICANON; + tcsetattr(fileno(stdin), TCSANOW, &tio); + + for(;;) { + char sign; + + int ret = read(0, &sign, 1); + if(!ret) break; + if(ret < 0) { + printf("read error: %s", strerror(errno)); + break; + } + + int code = 0; + switch(sign) { + case '0': code = 0; break; + case '1': code = 1; break; + case '2': code = 2; break; + case '3': code = 3; break; + case '4': code = 4; break; + case '5': code = 5; break; + case '6': code = 6; break; + case '7': code = 7; break; + case '8': code = 8; break; + case '9': code = 9; break; + case '*': code = 10; break; + case '#': code = 11; break; + case 'a': code = 12; break; + case 'b': code = 13; break; + case 'c': code = 14; break; + case 'd': code = 15; break; + default: continue; + } + + GstStructure* st = gst_structure_new ("dtmf-event", "type", G_TYPE_INT, 1, "number", G_TYPE_INT, code, "volume", G_TYPE_INT, 25, "start", G_TYPE_BOOLEAN, TRUE, NULL); + GstEvent* ev = gst_event_new_custom(GST_EVENT_CUSTOM_UPSTREAM, st); + gst_element_send_event(element, ev); + + // sleep is useless + st = gst_structure_new ("dtmf-event", "type", G_TYPE_INT, 1, "number", G_TYPE_INT, code, "start", G_TYPE_BOOLEAN, FALSE, NULL); + ev = gst_event_new_custom (GST_EVENT_CUSTOM_UPSTREAM, st); + gst_element_send_event(element, ev); + } + + g_main_loop_quit(loop); + return NULL; +} + +int init_code_reader(GMainLoop *loop, GstElement* element) +{ + g_assert(!reader_thread); + + struct thread_param* p = malloc(sizeof(struct thread_param)); + if(!p) + return -1; + + p->element = element; + p->loop = loop; + + reader_thread = g_thread_create(reader_thread_func, p, TRUE, NULL); + if(!reader_thread) + return -1; + + return 0; +} + + +int main (int argc, char *argv[]) +{ + GMainLoop *loop; + + GstElement *pipeline, *source, *demuxer, *decoder, *conv, *sink; + GstBus *bus; + + /* Initialisation */ + gst_init (&argc, &argv); + + loop = g_main_loop_new (NULL, FALSE); + + /* Create gstreamer elements */ + pipeline = gst_pipeline_new ("dtmftest"); + source = gst_element_factory_make ("dtmfsrc", "source"); + sink = gst_element_factory_make ("autoaudiosink", "output"); + + if (!pipeline || !source || !sink) { + g_printerr ("One element could not be created. Exiting.\n"); + return -1; + } + + g_object_set(G_OBJECT (source), "interval", 1, NULL); + + /* Set up the pipeline */ + + /* we add a message handler */ + bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); + gst_bus_add_watch (bus, bus_call, loop); + gst_object_unref (bus); + + /* we add all elements into the pipeline */ + /* file-source | ogg-demuxer | vorbis-decoder | converter | alsa-output */ + gst_bin_add_many (GST_BIN (pipeline), source, sink, NULL); + gst_element_link_many (source, sink, NULL); + + /* Set the pipeline to "playing" state*/ + g_print ("Now playing: %s\n", argv[1]); + gst_element_set_state (pipeline, GST_STATE_PLAYING); + + + init_code_reader(loop, pipeline); + + /* Iterate */ + g_print ("Running...\n"); + g_main_loop_run (loop); + + + /* Out of the main loop, clean up nicely */ + g_print ("Returned, stopping playback\n"); + gst_element_set_state (pipeline, GST_STATE_NULL); + + g_print ("Deleting pipeline\n"); + gst_object_unref (GST_OBJECT (pipeline)); + + return 0; +} -- cgit v1.2.3