1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222
|
The original UnixCW package, version 1, grew out of a desire to have a program
available under Linux that was very similar to the one I was used to under DOS.
While several Linux Morse Tutors were, in fact, still are, available, I never
quite found one that did the stuff I wanted.
From the original UnixCW package came version 2. This was almost a total
rewrite, although it included the same basic binaries as were in version 1.
The two major changes for this version were the addition of an extensive,
general purpose CW library, and also an X Window-based CW tutor program.
With version 2.1, finally, came full sound card support, built into the CW
library itself. All three main user level programs that use the library were
enhanced to allow control over the sound card tone volume. Console speaker
sound is still there, if needed, but sound card tones became the default mode.
Version 2.2 was a bug-fixed version of 2.1. It seems that some sound card
drivers (some later OSS drivers) couldn't handle the volume control ioctls that
the CW library uses, and this meant sound card tones would not work for these
systems. To solve this, version 2.2 uses the /dev/mixer device to control
volumes if it finds that it cannot do this with the main sound card device.
Version 2.3 is a thorough overhaul, cleanup, and refactoring of version 2.2.
All the code has been reformatted for correct Gnu style, and programs now take
a lot more care over what they do, and don't do, in signal handler context.
cwcp and xcwcp now offer fully configurable modes and dictionaries through a
configuration file option, and xcwcp has been rewritten in proper C++ style.
Version 3.0 has been prepared and released by new lead developer,
Kamil Ignacak. The takeover of unixcw has been discussed with and
approved by Simon Baldwin. Main changes in 3.0 are:
o rewriting parts of libcw so that using OSS is less probable to cause
problems (this should solve at least one Debian bug)
o adding support for ALSA to libcw; libcw uses OSS as default audio system,
but there are no differences in support of OSS and ALSA in terms of
functionality
o porting xcwcp to Qt4
The fact that there is a new maintainer should take some burden off of
shoulders of Kamal Mostafa, who was responsible for (among other things)
patching unixcw.
Version 3.0 introduces some changes in API, and there should be some
more API changes in 3.1. Hopefully things will be more stable in 3.2.
Version 3.0.1 contains small fixes that don't influence core capabilities
of any application, but are still important. Patches for this release were
provided mainly by Kamal Mostafa (thanks Kamal!).
Version 3.1.0 adds support for PulseAudio.
Plenty of other changes in library code improve timings of tones produced
by the library.
Few library functions are deprecated, they are replaced by new functions.
Version 3.1.1 fixes small problem with interlocks in thread code.
Version 3.2.0 introduces small fixes and improvements in libcw, and
implements new debug facilities (the old ones are being deprecated).
It also fixes faulty logic checking "--disable-feature" flags in
configure.ac. The problem was spotted by Thomas Beierlein.
Version 3.3.0 is mostly fixes. More fixes in configuration flags
(thanks again to Thomas Beierlein). Patches fixing compilation under
FreeBSD (thanks to Diane Bruce). Fixes and improvements of handling of
iambic keying in libcw and xcwcp. Fixing compilation error in
cwutils/dictionary.h.
Version 3.3.1 is just one fix in libcw. Thanks to Pino Zollo ZP4KFX
for reporting a bug and testing solution.
See NEWS file for more detailed log of changes.
The heart of the package is 'libcw'. This is a library which, when built,
offers the following basic CW services to a caller program:
o Morse code character translation tables, and lookup functions
o Morse code low-level timing calculations
o A 'sidetone' generation and queueing system, using either the system sound
card or the console speaker
o Optional keying control for an external device, say a transmitter, or an
oscillator
o CW character and string send routines, tied in with the character lookup
o CW receive routines, also tied in to the character lookup
o Adaptive speed tracking of received CW
o An iambic keyer, with both Curtis 8044 types A and B timing
o Straight key emulation
Relationship between version of unixcw package, and version of libcw
is following:
unixcw libcw
3.0 3.0.0
3.0.1 3.0.1
3.0.2 3.0.1
3.1.0 4.0.0
3.1.1 4.1.1
3.2.0 5.0.0
3.3.0 6.0.1
3.3.1 6.1.1
The library uses signals and threads to create a background task in
which it performs the majority of its work, leaving the main program
free to handle other tasks. For example, the simplest CW sending
program that uses the library looks like this (compile it with
"gcc -lcw example.c"):
#include <libcw.h>
int main ()
{
/* Library initialization */
cw_generator_new(CW_AUDIO_SOUNDCARD, NULL);
cw_generator_start();
/* Start the string sending in the background. */
cw_send_string("Hello, world");
/* Wait for the string send to complete. */
cw_wait_for_tone_queue();
/* Library cleanup */
cw_generator_stop();
cw_generator_delete();
return 0;
}
Instead of the cw_wait_for_tone_queue() call, this program could
instead handle any other work it has to do, asynchronously from the CW
library's sending.
As well as the handful of applications included in unixcw, the
following sorts of programs might also use 'libcw' as their core:
o A fully graphical CW send and receive station
o A 'CWbiff' that announces incoming email sender in CW
o An offline CW reader program, capable of decoding CW from MP3 or other
audio file formats
o A simple Iambic keyer for an external transmitter, using the mouse buttons
as the keyer paddles
o A more comprehensive CW tutor program
o An automated Morse Code testing application
'libcw' is written in C for easy portability and use.
The package comes with four basic applications:
o cw A CW sending 'engine' that reads characters from stdin, sounds
them on either the sound card or the console speaker, and echoes
them to stdout.
o cwgen A simple random character generator that can be used as a feed for
cw. For example:
cwgen | cw
o cwcp A curses-based program that generates groups of characters from
selected sets, words, and CW abbreviations randomly, and sounds
them using 'libcw'. It owes much to CP222.EXE, by VU2ZAP.
o xcwcp A CW tutor program for X Window environment. It offers the same
random and keyboard sending as 'cwcp', and in addition can read
CW that sent to it using the keyboard or mouse as a keyer, making
it useful for sending as well as receiving practice.
'libcw', 'cw', and 'cwgen' require a C compiler. 'cwcp' requires a C compiler
and a Curses library. 'xcwcp' requires a C++ compiler and a copy of the
Qt library (version 4). This library is fairly standard on Linux systems, as
it is the basis of KDE, so relying on this should not be too much of a problem.
See INSTALL for details on how to build unixcw from the distributed
sources.
unixcw is distributed under the terms of GNU GPL license, version 2 or
later. See COPYING for details.
Thanks to...
Kamal Mostafa, KA6MAL, for reviewing the libcw API, showing me the errors of my
ways with 64-bit integers, and hounding me to add the adaptive receive speed
tracking...
Joop Stakenborg, PG4I, for being a willing "guinea pig" with various snapshots
of unfinished versions of the package, for help in isolating various sound card
problems, and for his continued enthusiasm and interest in maintaining UnixCW
as a Debian Linux package...
Paolo Cravero, IK1ZYW, for very kindly making the first sound card patch
available for UnixCW 2. His tone generation code is now fully embedded inside
the CW library, and it's no exaggeration to say that without his help, there
would still be no sound card support in UnixCW...
Michael D. Ivey, for identifying a problem with CW sending rhythm when sending
in 'Farnsworth' mode, and for taking the time and trouble to test the patches
I sent him...
Wolf-Ruediger Juergens, for ideas on implementing CW weighting...
Diane Bruce and Jason L. Wright, for adding support for assorted BSD flavors...
Dan Jacobson, for making improvement suggestions above and beyond the call of
duty...
And finally, everyone else who has sent feedback about UnixCW. If not for your
interest, and fairly frequent requests for a version that works with a sound
card, the package would not have progressed at all.
Simon Baldwin, G0FRD <simon_baldwin@yahoo.com>
-------------------------
Kamil Ignacak <acerion@wp.pl>
|