summaryrefslogtreecommitdiff
path: root/tools/dtmf/gencrx.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/dtmf/gencrx.c')
-rwxr-xr-xtools/dtmf/gencrx.c116
1 files changed, 116 insertions, 0 deletions
diff --git a/tools/dtmf/gencrx.c b/tools/dtmf/gencrx.c
new file mode 100755
index 0000000..1c1f47f
--- /dev/null
+++ b/tools/dtmf/gencrx.c
@@ -0,0 +1,116 @@
+/*
+ * 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 <equinox@mur.at>
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ */
+
+#include <unistd.h>
+#include <stdio.h>
+#include <termios.h>
+#include <ctype.h>
+
+char sign2bin(c)
+{
+ switch(c) {
+ case 'D': return 0;
+ case '1': return 1;
+ case '2': return 2;
+ case '3': return 3;
+ case '4': return 4;
+ case '5': return 5;
+ case '6': return 6;
+ case '7': return 7;
+ case '8': return 8;
+ case '9': return 9;
+ case '0': return 10;
+ case '*': return 11;
+ case '#': return 12;
+ case 'A': return 13;
+ case 'B': return 14;
+ case 'C': return 15;
+ }
+ return 0;
+}
+
+char bin2sign(c)
+{
+ switch(c) {
+ case 0: return 'D';
+ case 1: return '1';
+ case 2: return '2';
+ case 3: return '3';
+ case 4: return '4';
+ case 5: return '5';
+ case 6: return '6';
+ case 7: return '7';
+ case 8: return '8';
+ case 9: return '9';
+ case 10: return '0';
+ case 11: return '*';
+ case 12: return '#';
+ case 13: return 'A';
+ case 14: return 'B';
+ case 15: return 'C';
+ }
+ return 0;
+}
+
+void send_crx_string(c)
+{
+ c = toupper(c);
+ if(c == '#' || c == '*' ||
+ (c >= '0' && c <= '9') ||
+ (c >= 'A' && c <= 'D') ) {
+ char cs = bin2sign(0x0A ^ sign2bin(c));
+ int ret = write(1, &"#42", 3);
+ ret = write(1, &c, 1);
+ ret = write(1, &cs, 1);
+ ret = write(1, &" ", 1);
+ }
+}
+
+int main (int argc, char *argv[])
+{
+ struct termios T;
+ tcgetattr(0, &T);
+ T.c_lflag &= ~ECHO;
+ T.c_lflag &= ~ICANON;
+ tcsetattr(0, TCSANOW, &T);
+
+ char c;
+ for(;;) {
+ int ret = read(0, &c, 1);
+ if(!ret) break;
+ if(ret == 1) send_crx_string(c);
+ else {
+ perror("read error: ");
+ return 1;
+ }
+ }
+
+ return 0;
+}