63 Commits
v0.1 ... v0.2.2

Author SHA1 Message Date
Gerolf Ziegenhain
cc3bf0ae5a typo 2015-07-07 19:54:19 +02:00
Gerolf Ziegenhain
bc62081ced typo 2015-07-07 19:53:40 +02:00
Gerolf Ziegenhain
24a5afa697 add screenshot 2015-04-29 21:37:50 +02:00
Gerolf Ziegenhain
7305e8a723 add osx screenshot 2015-04-29 21:36:28 +02:00
Gerolf Ziegenhain
aa596c0c66 add screenshot on osx 2015-04-29 21:35:08 +02:00
Gerolf Ziegenhain
2d8ca13a22 rm old posting 2015-03-04 20:10:57 +01:00
Gerolf Ziegenhain
f05f4ae2f7 add pins 2015-02-16 21:32:13 +01:00
Gerolf Ziegenhain
2f88687332 added test cases 2015-02-16 21:00:42 +01:00
Gerolf Ziegenhain
98d3b54d82 merged from dev 2015-02-16 18:41:26 +01:00
Gerolf Ziegenhain
fbd96d2495 doc 2015-02-16 18:39:55 +01:00
Gerolf Ziegenhain
0ccfe55978 wip 2015-02-15 13:13:49 +01:00
Gerolf Ziegenhain
eb1c87cb37 wip 2015-02-15 13:13:22 +01:00
Gerolf Ziegenhain
67acd163b6 wip 2015-02-15 13:11:40 +01:00
Gerolf Ziegenhain
2c71fe456d add doc by Les Kerr 2015-02-15 11:45:47 +01:00
8cH9azbsFifZ
0519826df2 Update README.md 2015-02-15 09:34:43 +01:00
Gerolf Ziegenhain
e4a61ba4a9 code quality warning 2015-02-15 09:27:13 +01:00
Gerolf Ziegenhain
251fa57b32 add java morsekob for testing 2015-02-07 21:23:58 +01:00
Gerolf Ziegenhain
b075427a3c more information on ext. hw 2015-02-07 21:21:33 +01:00
Gerolf Ziegenhain
77dc0cf117 formatting 2015-02-07 20:54:54 +01:00
Gerolf Ziegenhain
9319409282 wip 2015-02-03 23:29:32 +01:00
Gerolf Ziegenhain
572c6d93ac added jar for testing 2015-02-03 23:20:40 +01:00
Gerolf Ziegenhain
dd0881a5d4 added wikipedia section 2015-02-03 22:47:12 +01:00
Gerolf Ziegenhain
d73eb66b99 network trace for debug 2015-01-06 00:18:10 +01:00
Gerolf Ziegenhain
ae779dc2f5 magic numbers 2015-01-04 15:32:43 +01:00
Gerolf Ziegenhain
f028280963 cleanup 2015-01-04 15:29:26 +01:00
Gerolf Ziegenhain
765cb854ed initialization of packets 2015-01-04 15:26:52 +01:00
Gerolf Ziegenhain
12f2d905ce started separating protocol. 2015-01-04 15:02:18 +01:00
Gerolf Ziegenhain
1140c99193 started separating protocol. 2015-01-04 15:02:03 +01:00
Gerolf Ziegenhain
272d03cbc8 merged from master 2015-01-04 14:44:17 +01:00
Gerolf Ziegenhain
d2f8a0b65f merged from master 2015-01-04 14:43:50 +01:00
Gerolf Ziegenhain
87dbb05d3e merged from master 2015-01-04 14:43:28 +01:00
Gerolf Ziegenhain
9599bae5a8 merged from master 2015-01-04 14:43:06 +01:00
Gerolf Ziegenhain
dccf7e6cfc documented structures 2015-01-04 14:39:51 +01:00
Gerolf Ziegenhain
b20d4efe9e removed unused structure 2015-01-04 14:36:48 +01:00
Gerolf Ziegenhain
e0471a4c62 added dg6fl 2015-01-04 13:25:38 +01:00
Gerolf Ziegenhain
24a74dbd55 added changelog 2015-01-04 13:24:47 +01:00
Gerolf Ziegenhain
cb783b97e1 added description of the protocol 2015-01-04 13:22:32 +01:00
Gerolf Ziegenhain
45716af4f9 magic number - sizes of packets 2015-01-04 13:21:35 +01:00
Gerolf Ziegenhain
9d540cf369 magic number - sizes of packets 2015-01-04 13:19:56 +01:00
Gerolf Ziegenhain
a2200a4aa6 added links to usb serial drivers 2015-01-04 10:22:13 +01:00
Gerolf Ziegenhain
182be32401 added authors file 2015-01-04 10:19:11 +01:00
Gerolf Ziegenhain
f222d65bd8 moved x86 stuff to src 2015-01-04 10:06:40 +01:00
Gerolf Ziegenhain
840bbd0c04 typo 2015-01-04 02:36:57 +01:00
Gerolf Ziegenhain
50dfd48602 additional information 2015-01-04 00:12:56 +01:00
Gerolf Ziegenhain
5ffefff868 additional information 2015-01-04 00:04:09 +01:00
Gerolf Ziegenhain
dd72972a96 additional information 2015-01-03 23:59:18 +01:00
Gerolf Ziegenhain
572345d34b references 2015-01-03 23:45:14 +01:00
Gerolf Ziegenhain
04572c6c16 references 2015-01-03 23:42:00 +01:00
Gerolf Ziegenhain
f7b1bf6e1e references 2015-01-03 23:39:12 +01:00
Gerolf Ziegenhain
4c02a54109 formatting 2015-01-03 23:28:04 +01:00
Gerolf Ziegenhain
7e8c1803af formatting 2015-01-03 23:26:48 +01:00
Gerolf Ziegenhain
247deb12dc formatting 2015-01-03 23:26:01 +01:00
Gerolf Ziegenhain
6e141246f6 formatting 2015-01-03 23:19:29 +01:00
Gerolf Ziegenhain
8f77f51fcf linux installation notes 2015-01-03 23:15:12 +01:00
Gerolf Ziegenhain
c8105acca0 linux notes 2015-01-03 23:14:25 +01:00
Gerolf Ziegenhain
b2f24af29e merged linux build 2015-01-03 23:12:02 +01:00
Gerolf Ziegenhain
0b242efc1a merged linux build 2015-01-03 23:11:45 +01:00
Gerolf Ziegenhain
adeba195f6 merged makefiles 2015-01-03 23:00:47 +01:00
Gerolf Ziegenhain
0424b7e2d3 removed obsolete files 2015-01-03 22:59:08 +01:00
Gerolf Ziegenhain
87f8437b87 modified for wheezy - without sound.c 2015-01-03 22:58:48 +01:00
Gerolf Ziegenhain
ecce799bb7 add osx build 2015-01-03 22:45:02 +01:00
Gerolf Ziegenhain
a4bbec6497 osx port 2015-01-03 22:38:23 +01:00
Gerolf Ziegenhain
325d794b7c compile instructions debian 2015-01-03 22:36:21 +01:00
13 changed files with 249 additions and 226 deletions

2
.gitignore vendored
View File

@@ -1 +1,3 @@
.DS_Store
irmc
irmc.o

8
AUTHORS Normal file
View File

@@ -0,0 +1,8 @@
Fernan Bolando (VE4FEB)
Gerolf Ziegenhain (DG6FL)
MorseKOB:
Lex Kerr
CWCom Protocol:
John Samien (VK1EME)

105
README.md
View File

@@ -1,41 +1,88 @@
=== WIP - Snipplets ===
How to use:
irmc - Internet Relay Morse Code
================================
1 usage: irmc [hostname] [port] [channel] [id] [serialport]
./irmc mtc-kob.dyndns.org 7890 103 123 /dev/tty.usbserial
faeroes.sdf.org.7890
IRMC stands for Internet Relay Morse Code and is an implementation of [MOIP](https://github.com/8cH9azbsFifZ/moip).
It implements the [CWCom protocol](http://kob.sdf.org/morsekob/docs/cwcom.pdf)
as adopted by [MorseKOB](http://kob.sdf.org/morsekob/docs/history.pdf).
You can try out the software in a [browser](http://kob.sdf.org/morsekob/morsekob30/index.htm) using Java.
![Screenshot on OSX](/doc/screenshot.png?raw=true "Screenshot")
TBD: Driver:
serial - 2usb!
# How to build?
## Install dependency: morse keyer library
```
wget https://github.com/8cH9azbsFifZ/morse/archive/v0.1.tar.gz
tar xzf v0.1.tar.gz
cd morse-0.1
libtoolize
./autogen.sh
./configure --with-portaudio
make
sudo make install
```
TBD: OSX - howto install dependencies
## Debian (Wheezy)
Some dependencies have to be installed:
```
apt-get install -y alsa-oss oss-compat build-essential autoconf libao-dev libtool
```
Afterwards compilation with `make` should work. If something went wrong, you may have
to adjust your `LD_LIBRARY_PATH`. Alternatively try:
```
LD_LIBRARY_PATH=/usr/local/lib ./irmc mtc-kob.dyndns.org 7890 33 123
```
=== Original post ===
I have been using cwcom to practice sending morsecode, unfortunately my main computer at home is running openbsd and it has gotten harder to gain access to a reliable MS Windows machine. So I wrote my own client that works on openbsd.
This is written in C and although not tested it should compile under other OS. If any one wants to try it and send me feedback. you can download version 0.01 here http://fernan.bitbucket.org/irmc.tgz
Les Kerr of https://home.comcast.net/~morsekob/ has been very patient in answering my questions regarding the cwcom protocol and setting up a test server during debugging.
## OSX (Yosemite)
Compilation with make :)
There are few difference between this and the official cwcom client
1. It is a command line tool
2. It does not send the characters of the message to the receivers screen.
3. It does not translate CW for you. You can try fldigi if you just want see the transmission.
4. Tone pitch is currently hard coded to 650Hz
5. It does not have a way to show you who is listening.
For the USB serial devices you need a PL2303 driver
(i.e. [PL2303_Serial-USB_on_OSX_Lion.pkg](http://changux.co/osx-installer-to-pl2303-serial-usb-on-osx-lio/)).
Bugs
There are a few that I am working on right now, but feel free to send me feedback if you get a chance to try it out.
## Testing
./irmc morsecode.dyndns.org 7890 2348 test
File(s)
http://fernan.bitbucket.org/irmc.tgz
Or you may want to use tcpdump, i.e.:
```
sudo tcpdump -i all -vvvv "host faeroes.sdf.org"
```
Resources
The following people have helped me a lot to learn the protocols and setting up test servers.
Les Kerr - https://home.comcast.net/~morsekob/
Bob Denny - http://morse-rss-news.sourceforge.net/
John Samin - http://www.mrx.com.au/
# How to use:
The usage is: `irmc [hostname] [port] [channel] [id] [serialport`
For example:
`./irmc mtc-kob.dyndns.org 7890 103 MyID /dev/tty.usbserial´
## Hardware interface options
A good description on how to build different interfaces (telegraph key, sounder or both)
is given on the [MorseKOB Website](http://kob.sdf.org/morsekob/interface.htm).
Landline telegraphs use "closed circuits" for communications; if you have built one at home,
you may also use the [loop interface](http://kob.sdf.org/morsekob/docs/loopinterface.pdf).
Connection of a morse key:
Serial PIN: 4 & 6
[layout of pins](http://techpubs.sgi.com/library/dynaweb_docs/0650/SGI_Admin/books/MUX_IG/sgi_html/figures/4-2.serial.port.con.gif)
Connecting the palm radio: keep an eye on the grounding :)
http://kob.sdf.org/morsekob/interface.htm#portpins
RS232 DB9 Function
DTR 4 Manual Key / paddle common
DSR 6 Manual key / dot paddle
CTS 8 Dash paddle
RTS 7 Sounder output
SG 5 Sounder ground
# Changelog
* v0.2 [zip](https://github.com/8cH9azbsFifZ/irmc/archive/v0.2.zip) - ported to debian wheezy and osx yosemite, DG6FL
* v0.1 [zip](https://github.com/8cH9azbsFifZ/irmc/archive/v0.1.zip) - original version, VE7FEB
Code Quality
============
This is experimental code.
=== Source: http://fernski.blogspot.de/2013/03/internet-relay-morsecode.html ===
=== End Original Post ===

BIN
doc/cwcom.pdf Normal file

Binary file not shown.

BIN
doc/loopinterface.pdf Normal file

Binary file not shown.

BIN
doc/screenshot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

94
sound.c
View File

@@ -1,94 +0,0 @@
/* irmc - internet relay morsecode client */
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <soundcard.h>
#include <math.h>
#define SAMPLE_RATE 48000
int sample_rate = SAMPLE_RATE;
int fd_speaker;
int zinebuf[SAMPLE_RATE * 2];
int pitch = 650;
void
init_sound()
{
int i, pr;
pr = sample_rate / pitch;
for(i = 0; i < SAMPLE_RATE * 2; i++)
zinebuf[i] = 32767 * sin(2 * 3.1415 / pr * (double)i );
}
void
play_code_element (int length)
{
int i;
short buf[SAMPLE_RATE * 4];
int outsz;
outsz = abs(length) * SAMPLE_RATE / 1000;
if(length == 0 || abs(length) > 2000) return;
if(length < 0) { /* Space */
for (i = 0; i < outsz; i++) buf[i] = 0;
} else { /* Mark */
for (i = 0; i < outsz; i++) buf[i] = zinebuf[i];
}
if (write (fd_speaker, buf, outsz * 2) != (outsz * 2)){
perror ("Audio write");
exit (-1);
}
}
int
open_audio_device (char *name, int mode)
{
int tmp, fd;
if ((fd = open (name, mode, 0)) == -1){
perror (name);
//exit (-1);
}
tmp = AFMT_S16_NE; /* Native 16 bits */
if (ioctl (fd, SNDCTL_DSP_SETFMT, &tmp) == -1){
perror ("SNDCTL_DSP_SETFMT");
exit (-1);
}
if (tmp != AFMT_S16_NE){
fprintf (stderr,
"The device doesn't support the 16 bit sample format.\n");
exit (-1);
}
tmp = 1;
if (ioctl (fd, SNDCTL_DSP_CHANNELS, &tmp) == -1){
perror ("SNDCTL_DSP_CHANNELS");
exit (-1);
}
if (tmp != 1){
fprintf (stderr, "The device doesn't support mono mode.\n");
exit (-1);
}
//sample_rate = 48000;
if (ioctl (fd, SNDCTL_DSP_SPEED, &sample_rate) == -1){
perror ("SNDCTL_DSP_SPEED");
exit (-1);
}
return fd;
}

View File

@@ -1,3 +0,0 @@
void init_sound (void);
void play_code_element (int);
int open_audio_device (char *, int);

View File

@@ -1,7 +1,7 @@
SRC = irmc.c sound.c
SRC = irmc.c cwprotocol.c
OBJ = ${SRC:.c=.o}
LDFLAGS = -lm -lossaudio
CFLAGS = -Wall
LDFLAGS = -L/usr/local/lib -L/opt/local/lib -lm -lmorse
CFLAGS = -I/usr/local/include -I/opt/local/include -Wall
INSTALLDIR = ${HOME}/bin
all: options irmc
@@ -21,9 +21,8 @@ irmc: ${OBJ}
@echo CC -o $@
@${CC} -o $@ ${OBJ} ${LDFLAGS}
hex: ${OBJ}
@echo avr-gcc -o $@
avr-gcc -o $@ ${OBJ} ${LDFLAGS}
java:
java -jar test/MorseKOB.jar
clean:
@echo cleaning

36
src/cwprotocol.c Normal file
View File

@@ -0,0 +1,36 @@
#include <stdio.h>
#include "cwprotocol.h"
int prepare_id (struct data_packet_format *id_packet, char *id)
{
id_packet->command = DAT;
id_packet->length = SIZE_DATA_PACKET_PAYLOAD;
snprintf(id_packet->id, SIZE_ID, id, "%s");
id_packet->sequence = 0;
id_packet->n = 0;
snprintf(id_packet->status, SIZE_ID, INTERFACE_VERSION);
id_packet->a21 = 1; /* These magic numbers was provided by Les Kerr */
id_packet->a22 = 755;
id_packet->a23 = 65535;
return 0;
}
int prepare_tx (struct data_packet_format *tx_packet, char *id)
{
int i;
tx_packet->command = DAT;
tx_packet->length = SIZE_DATA_PACKET_PAYLOAD;
snprintf(tx_packet->id, SIZE_ID, id, "%s");
tx_packet->sequence = 0;
tx_packet->n = 0;
for(i = 1; i < 51; i++)tx_packet->code[i] = 0;
tx_packet->a21 = 0; /* These magic numbers was provided by Les Kerr */
tx_packet->a22 = 755;
tx_packet->a23 = 16777215;
snprintf(tx_packet->status, SIZE_STATUS, "?");
return 0;
}

45
src/cwprotocol.h Normal file
View File

@@ -0,0 +1,45 @@
#define INTERFACE_VERSION "irmc v0.02"
// Structures for the packets: unsigned short command
#define DIS 0x0002 // disconnect
#define DAT 0x0003
#define CON 0x0004 // connect
#define ACK 0x0005
#define SIZE_COMMAND_PACKET 4
#define SIZE_DATA_PACKET 496
#define SIZE_DATA_PACKET_PAYLOAD 492 // = SIZE_DATA_PACKET - SIZE_COMMAND_PACKET
#define SIZE_ID 128
#define SIZE_STATUS 128
#define SIZE_CODE 51
// This structure will be used to (dis-)connect to KOB servers
struct command_packet_format{
unsigned short command; // CON / DIS
unsigned short channel; // Channel number
};
// This structure will be used for id, rx and tx packets
struct data_packet_format{
unsigned short command;
unsigned short length;
char id[SIZE_ID];
char a1[4];
unsigned int sequence;
unsigned int a21;
unsigned int a22;
unsigned int a23;
signed int code[SIZE_CODE];
unsigned int n;
char status[SIZE_STATUS]; /* This is called version in MorseKob */
char a4[8];
};
// Define the packets used
#define DEFAULT_CHANNEL 103
int prepare_id (struct data_packet_format *id_packet, char *id);
int prepare_tx (struct data_packet_format *tx_packet, char *id);

View File

@@ -11,60 +11,38 @@
#include <sys/socket.h>
#include <math.h>
#include <fcntl.h>
#include <soundcard.h>
#include <morse/beep.h>
#ifdef __MACH__
#define LIBOSS_INTERNAL
#include <liboss/soundcard.h> //will not be used for audio any more
#else
#include <linux/ioctl.h>
#include <asm-generic/ioctl.h>
#include <asm-generic/termios.h>
#endif
#include <signal.h>
#include <arpa/inet.h>
#include "sound.h"
#include <time.h>
#include <sys/time.h>
#include <stdio.h>
#ifdef __MACH__
#include <mach/clock.h>
#include <mach/mach.h>
#endif
#define DEBUG 0
#define MAXDATASIZE 1024 // max number of bytes we can get at once
#define DIS 0x0002
#define DAT 0x0003
#define CON 0x0004
#define ACK 0x0005
#define DEBUG 0
struct command_packet_format{
unsigned short command;
unsigned short channel;
};
struct data_packet_format{
unsigned short command;
unsigned short length;
char id[128];
char a1[4];
unsigned int sequence;
unsigned int a21;
unsigned int a22;
unsigned int a23;
signed int code[51];
unsigned int n;
char status[128]; /* This is called version in MorseKob */
char a4[8];
};
struct code_packet_format{
unsigned short command;
unsigned short length;
char id[128];
char a1[4];
unsigned int sequence;
unsigned int a21;
unsigned int a22;
unsigned int a23;
signed int code[51];
unsigned int n;
char a3[128];
char a4[8];
};
struct command_packet_format connect_packet;
#include "cwprotocol.h"
struct command_packet_format connect_packet = {CON, DEFAULT_CHANNEL};
struct command_packet_format disconnect_packet = {DIS, 0};
struct data_packet_format id_packet;
struct data_packet_format rx_data_packet;
struct data_packet_format tx_data_packet;
int serial_status = 0, fd_speaker, fd_serial, fd_socket, numbytes;
int serial_status = 0, fd_serial, fd_socket, numbytes;
int tx_sequence = 0, rx_sequence;
double tx_timeout = 0;
@@ -73,7 +51,6 @@ long tx_timer = 0;
#define TX_TIMEOUT 240.0
#define KEEPALIVE_CYCLE 100
char soundcard[] = "/dev/audio";
long key_press_t1;
long key_release_t1;
int last_message = 0;
@@ -83,6 +60,22 @@ char last_sender[16];
int translate = 0;
int audio_status = 1;
/* portable time, as listed in https://gist.github.com/jbenet/1087739 */
void current_utc_time(struct timespec *ts) {
#ifdef __MACH__ // OS X does not have clock_gettime, use clock_get_time
clock_serv_t cclock;
mach_timespec_t mts;
host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock);
clock_get_time(cclock, &mts);
mach_port_deallocate(mach_task_self(), cclock);
ts->tv_sec = mts.tv_sec;
ts->tv_nsec = mts.tv_nsec;
#else
clock_gettime(CLOCK_REALTIME, ts);
#endif
}
/* a better clock() in milliseconds */
long
fastclock(void)
@@ -90,7 +83,7 @@ fastclock(void)
struct timespec t;
long r;
clock_gettime(CLOCK_REALTIME, &t);
current_utc_time (&t);
r = t.tv_sec * 1000;
r = r + t.tv_nsec / 1000000;
return r;
@@ -123,22 +116,23 @@ void *get_in_addr(struct sockaddr *sa)
return &(((struct sockaddr_in6*)sa)->sin6_addr);
}
// connect to server and send my id.
void
identifyclient(void)
{
tx_sequence++;
id_packet.sequence = tx_sequence;
send(fd_socket, &connect_packet, sizeof(connect_packet), 0);
send(fd_socket, &id_packet, 496, 0);
send(fd_socket, &connect_packet, SIZE_COMMAND_PACKET, 0);
send(fd_socket, &id_packet, SIZE_DATA_PACKET, 0);
}
// disconnect from the server
void
inthandler(int sig)
{
signal(sig, SIG_IGN);
send(fd_socket, &disconnect_packet, sizeof(disconnect_packet), 0);
send(fd_socket, &disconnect_packet, SIZE_COMMAND_PACKET, 0);
close(fd_socket);
close(fd_speaker);
close(fd_serial);
exit(1);
}
@@ -169,7 +163,7 @@ txloop (void)
if(tx_timeout > TX_TIMEOUT) return;
}
key_press_t1 = fastclock();
if(tx_data_packet.n == 50) {
if(tx_data_packet.n == SIZE_CODE) {
printf("irmc: warning packet is full.\n");
return;
}
@@ -195,7 +189,7 @@ commandmode(void)
tx_data_packet.code[0] = -1;
tx_data_packet.code[1] = 1;
tx_data_packet.n = 2;
for(i = 0; i < 5; i++) send(fd_socket, &tx_data_packet, 496, 0);
for(i = 0; i < 5; i++) send(fd_socket, &tx_data_packet, SIZE_DATA_PACKET, 0);
tx_data_packet.n = 0;
return 0;
}
@@ -206,7 +200,7 @@ commandmode(void)
tx_data_packet.code[0] = -1;
tx_data_packet.code[1] = 2;
tx_data_packet.n = 2;
for(i = 0; i < 5; i++) send(fd_socket, &tx_data_packet, 496, 0);
for(i = 0; i < 5; i++) send(fd_socket, &tx_data_packet, SIZE_DATA_PACKET, 0);
tx_data_packet.n = 0;
return 0;
}
@@ -221,12 +215,10 @@ commandmode(void)
if((strncmp(cmd, "aon", 3)) == 0){
audio_status = 1;
fd_speaker = open_audio_device(soundcard, O_WRONLY);
return 0;
}
if((strncmp(cmd, "aoff", 3)) == 0){
audio_status = 0;
close(fd_speaker);
return 0;
}
printf("?\n");
@@ -275,10 +267,9 @@ int main(int argc, char *argv[])
char hostname[64];
char port[16];
int channel;
char id[128];
char id[SIZE_ID];
char serialport[64];
if (argc < 4) {
fprintf(stderr," %i usage: irmc [hostname] [port] [channel] [id] [serialport]\n", argc);
exit(1);
@@ -287,34 +278,13 @@ int main(int argc, char *argv[])
snprintf(hostname, 64, argv[1], "%s");
snprintf(port, 16, argv[2], "%s");
channel = atoi(argv[3]);
if(argc > 4) snprintf(id, 128, argv[4], "%s");
else snprintf(id, 128, "irmc");
if(argc > 4) snprintf(id, SIZE_ID, argv[4], "%s");
else snprintf(id, SIZE_ID, "irmc");
if(argc > 5) snprintf(serialport, 64, argv[5], "%s");
id_packet.command = DAT;
id_packet.length = 492;
snprintf(id_packet.id, 128, id, "%s");
id_packet.sequence = 0;
id_packet.n = 0;
snprintf(id_packet.status, 128, "irmc v0.02");
id_packet.a21 = 1; /* These magic numbers was provided by Les Kerr */
id_packet.a22 = 755;
id_packet.a23 = 65535;
tx_data_packet.command = DAT;
tx_data_packet.length = 492;
snprintf(tx_data_packet.id, 128, id, "%s");
tx_data_packet.sequence = 0;
tx_data_packet.n = 0;
for(i = 1; i < 51; i++)tx_data_packet.code[i] = 0;
tx_data_packet.a21 = 0; /* These magic numbers was provided by Les Kerr */
tx_data_packet.a22 = 755;
tx_data_packet.a23 = 16777215;
snprintf(tx_data_packet.status, 128, "?");
connect_packet.command = CON;
connect_packet.channel = channel;
prepare_id (&id_packet, id);
prepare_tx (&tx_data_packet, id);
connect_packet.channel = channel;
signal(SIGINT, inthandler);
@@ -354,7 +324,7 @@ int main(int argc, char *argv[])
inet_ntop(p->ai_family, get_in_addr((struct sockaddr *)p->ai_addr),
s, sizeof s);
printf("irmc: connected to %s\n", s);
fd_speaker = open_audio_device(soundcard, O_WRONLY);
beep_init();
fd_serial = open(serialport, O_RDWR | O_NOCTTY | O_NDELAY);
if(fd_serial == -1) {
printf("irmc: unable to open serial port.\n");
@@ -362,7 +332,6 @@ int main(int argc, char *argv[])
freeaddrinfo(servinfo); /* all done with this structure */
key_release_t1 = fastclock();
init_sound();
identifyclient();
/* Main Loop */
@@ -370,8 +339,8 @@ int main(int argc, char *argv[])
if(tx_timer == 0)
if((numbytes = recv(fd_socket, buf, MAXDATASIZE-1, 0)) == -1)
usleep(250);
if(numbytes == 496 && tx_timer == 0){
memcpy(&rx_data_packet, buf, 496);
if(numbytes == SIZE_DATA_PACKET && tx_timer == 0){
memcpy(&rx_data_packet, buf, SIZE_DATA_PACKET);
#if DEBUG
printf("length: %i\n", rx_data_packet.length);
printf("id: %s\n", rx_data_packet.id);
@@ -379,7 +348,7 @@ int main(int argc, char *argv[])
printf("version: %s\n", rx_data_packet.status);
printf("n: %i\n", rx_data_packet.n);
printf("code:\n");
for(i = 0; i < 51; i++)printf("%i ", rx_data_packet.code[i]); printf("\n");
for(i = 0; i < SIZE_CODE; i++)printf("%i ", rx_data_packet.code[i]); printf("\n");
#endif
if(rx_data_packet.n > 0 && rx_sequence != rx_data_packet.sequence){
message(2);
@@ -397,8 +366,23 @@ int main(int argc, char *argv[])
message(4);
break;
default:
if(audio_status == 1)
play_code_element (rx_data_packet.code[i]);
if(audio_status == 1)
{
int length = rx_data_packet.code[i];
if(length == 0 || abs(length) > 2000) {
}
else
{
if(length < 0) {
beep(0.0, abs(length)/1000.);
}
else
{
beep(1000.0, length/1000.);
}
}
}
break;
}
}
@@ -409,7 +393,7 @@ int main(int argc, char *argv[])
if(tx_data_packet.n > 1 ){
tx_sequence++;
tx_data_packet.sequence = tx_sequence;
for(i = 0; i < 5; i++) send(fd_socket, &tx_data_packet, 496, 0);
for(i = 0; i < 5; i++) send(fd_socket, &tx_data_packet, SIZE_DATA_PACKET, 0);
#if DEBUG
printf("irmc: sent data packet.\n");
#endif
@@ -440,9 +424,8 @@ int main(int argc, char *argv[])
}
} /* End of mainloop */
send(fd_socket, &disconnect_packet, sizeof(disconnect_packet), 0);
send(fd_socket, &disconnect_packet, SIZE_COMMAND_PACKET, 0);
close(fd_socket);
close(fd_speaker);
close(fd_serial);
exit(0);

BIN
src/test/MorseKOB.jar Executable file

Binary file not shown.