001 /*
002 * Copyright (C) 2006-2010 Enrique Lara (k957@68k.org)
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017 package net.sf.jmorse;
018
019 import net.sf.jmorse.util.logging.Logger;
020
021 import java.io.BufferedReader;
022 import java.io.File;
023 import java.io.FileReader;
024 import java.io.IOException;
025 import java.io.InputStreamReader;
026 import java.io.Reader;
027 import java.io.StringReader;
028
029 /**
030 * @author <a href="mailto:k957@68k.org">Enrique Lara</a>
031 */
032 public class JMorse extends Thread {
033 private static final Logger s_log = Logger.getLogger(JMorse.class);
034 private static final boolean DEBUG_ENABLED = s_log.isDebugEnabled();
035 protected AudioMorseWriter morse = new AudioMorseWriter();
036 private boolean doRun = true;
037
038 public JMorse() {
039 init(new String[] { });
040 }
041
042 public JMorse(String[] args) {
043 init(args);
044 }
045
046 protected void init(String[] args) {
047 morse.setWpm(15);
048 morse.setTone(450);
049 morse.setVolume(5);
050
051 String outputFileName = null;
052 String inputFileName = null;
053
054 StringBuffer msg = new StringBuffer();
055 boolean done = false;
056
057 for (int i = 0; (i < args.length) && !done; i++) {
058 String arg = args[i];
059
060 if (DEBUG_ENABLED) {
061 s_log.debug("arg=" + arg);
062 }
063
064 if ("--help".equals(arg)) {
065 usage();
066 doRun = false;
067 done = true;
068 } else if ("--version".equals(arg)) {
069 version();
070 doRun = false;
071 done = true;
072 } else if (arg.startsWith("-") && (arg.indexOf("=") != -1)) {
073 String[] tmp = arg.substring(1).split("[=]");
074 String key = tmp[0];
075 String value = tmp[1];
076
077 if ("w".equals(key)) {
078 morse.setWpm(Integer.parseInt(value));
079 } else if ("t".equals(key)) {
080 morse.setTone(Integer.parseInt(value));
081 } else if ("v".equals(key)) {
082 morse.setVolume(Integer.parseInt(value));
083 } else if ("o".equals(key)) {
084 outputFileName = value;
085 } else if ("i".equals(key)) {
086 inputFileName = value;
087 } else {
088 s_log.warn("Unrecognize argument:" + arg);
089 done = true;
090 }
091 } else {
092 if (msg.length() > 0) {
093 msg.append(" ");
094 }
095
096 msg.append(arg);
097 }
098 }
099
100 if (outputFileName != null) {
101 try {
102 MorseAudioFileWriter tmpMorse = new MorseAudioFileWriter(outputFileName);
103 tmpMorse.setWpm(morse.getWpm());
104 tmpMorse.setTone(morse.getTone());
105 tmpMorse.setVolume(morse.getVolume());
106
107 morse = tmpMorse;
108 } catch (Exception e) {
109 s_log.error("Problems Creating output File", e);
110 }
111 }
112
113 if (inputFileName != null) {
114 msg = new StringBuffer();
115
116 File inputFile = new File(inputFileName);
117
118 try {
119 reader = new BufferedReader(new FileReader(inputFile));
120 } catch (Exception e) {
121 s_log.error("Problems reading input file:" + inputFile, e);
122 }
123 } else if (msg.length() > 0) {
124 reader = new StringReader(msg.toString());
125 }
126 }
127
128 String singlePlayMsg = null;
129 File outputFile = null;
130 Reader reader = new BufferedReader(new InputStreamReader(System.in));
131
132 public void run() {
133 if (doRun) {
134 try {
135 char[] cbuf = new char[1024];
136 int len;
137
138 while ((len = reader.read(cbuf)) != -1) {
139 morse.write(cbuf, len);
140 }
141
142 if (DEBUG_ENABLED) {
143 s_log.debug("bye from JMorse");
144 }
145 } catch (IOException e) {
146 s_log.warn("IOException", e);
147 }
148 }
149
150 if (DEBUG_ENABLED) {
151 s_log.debug("DONE.");
152 }
153 }
154
155 private void version() {
156 System.out.println("jmorse 1.2");
157 System.out.println("Copyright (C) 2006-2010 Enrique Lara (k957@68k.org)");
158 System.out.println("Licensed under the Apache License, Version 2.0");
159 }
160
161 private void usage() {
162 System.out.println("Usage: java -jar jmorse.jar [OPTION] {string} [FILE]");
163 System.out.println("Use string, file, or standard input, to generate morse code on the default audio output device.");
164 System.out.println("");
165 System.out.println(" -t tone");
166 System.out.println(" -w word speed");
167 System.out.println(" -v volume [0-10]");
168 System.out.println(" -i text file to use as message text");
169 System.out.println(" -o output file to store morse code as wave");
170 System.out.println(" --help display this help and exit");
171 System.out.println(" --version output version information and exit");
172 System.out.println(" --version output version information and exit");
173 System.out.println("");
174 System.out.println("If no input file or string is specified, then the standard input is read.");
175 }
176
177 public static void main(String[] args) {
178 JMorse app = new JMorse(args);
179 app.start();
180 }
181 }