mirror of https://github.com/wb2osz/direwolf.git
Time stamps and documentation for kissutil.
This commit is contained in:
parent
6e34b5f472
commit
c904b57d1d
|
@ -432,7 +432,7 @@ aclients : aclients.c ax25_pad.c fcs_calc.c textcolor.o misc.a
|
||||||
# Note: kiss_frame.c has conditional compilation on KISSUTIL.
|
# Note: kiss_frame.c has conditional compilation on KISSUTIL.
|
||||||
|
|
||||||
kissutil : kissutil.c kiss_frame.c ax25_pad.o fcs_calc.o textcolor.o serial_port.o dtime_now.o sock.o misc.a
|
kissutil : kissutil.c kiss_frame.c ax25_pad.o fcs_calc.o textcolor.o serial_port.o dtime_now.o sock.o misc.a
|
||||||
$(CC) $(CFLAGS) -g -DKISSUTIL -o $@ $^
|
$(CC) $(CFLAGS) -g -DKISSUTIL -o $@ $^ $(LDFLAGS)
|
||||||
|
|
||||||
|
|
||||||
# Touch Tone to Speech sample application.
|
# Touch Tone to Speech sample application.
|
||||||
|
@ -637,6 +637,7 @@ install : $(APPS) direwolf.conf tocalls.txt symbols-new.txt symbolsX.txt dw-icon
|
||||||
$(INSTALL) -D --mode=644 man1/decode_aprs.1 $(INSTALLDIR)/man/man1/decode_aprs.1
|
$(INSTALL) -D --mode=644 man1/decode_aprs.1 $(INSTALLDIR)/man/man1/decode_aprs.1
|
||||||
$(INSTALL) -D --mode=644 man1/direwolf.1 $(INSTALLDIR)/man/man1/direwolf.1
|
$(INSTALL) -D --mode=644 man1/direwolf.1 $(INSTALLDIR)/man/man1/direwolf.1
|
||||||
$(INSTALL) -D --mode=644 man1/gen_packets.1 $(INSTALLDIR)/man/man1/gen_packets.1
|
$(INSTALL) -D --mode=644 man1/gen_packets.1 $(INSTALLDIR)/man/man1/gen_packets.1
|
||||||
|
$(INSTALL) -D --mode=644 man1/kissutil.1 $(INSTALLDIR)/man/man1/kissutil.1
|
||||||
$(INSTALL) -D --mode=644 man1/ll2utm.1 $(INSTALLDIR)/man/man1/ll2utm.1
|
$(INSTALL) -D --mode=644 man1/ll2utm.1 $(INSTALLDIR)/man/man1/ll2utm.1
|
||||||
$(INSTALL) -D --mode=644 man1/log2gpx.1 $(INSTALLDIR)/man/man1/log2gpx.1
|
$(INSTALL) -D --mode=644 man1/log2gpx.1 $(INSTALLDIR)/man/man1/log2gpx.1
|
||||||
$(INSTALL) -D --mode=644 man1/text2tt.1 $(INSTALLDIR)/man/man1/text2tt.1
|
$(INSTALL) -D --mode=644 man1/text2tt.1 $(INSTALLDIR)/man/man1/text2tt.1
|
||||||
|
|
|
@ -430,9 +430,9 @@ install-conf : direwolf.conf
|
||||||
|
|
||||||
# Separate application to decode raw data.
|
# Separate application to decode raw data.
|
||||||
|
|
||||||
# First two use .c rather than .o because they depend on DECAMAIN definition.
|
# First three use .c rather than .o because they depend on DECAMAIN definition.
|
||||||
|
|
||||||
decode_aprs : decode_aprs.c kiss_frame.c dwgpsnmea.o dwgps.o dwgpsd.o serial_port.o symbols.o ax25_pad.o textcolor.o fcs_calc.o latlong.o log.o telemetry.o tt_text.o
|
decode_aprs : decode_aprs.c kiss_frame.c ax25_pad.c dwgpsnmea.o dwgps.o dwgpsd.o serial_port.o symbols.o textcolor.o fcs_calc.o latlong.o log.o telemetry.o tt_text.o
|
||||||
$(CC) $(CFLAGS) -DDECAMAIN -o $@ $^ -lm
|
$(CC) $(CFLAGS) -DDECAMAIN -o $@ $^ -lm
|
||||||
|
|
||||||
# Convert between text and touch tone representation.
|
# Convert between text and touch tone representation.
|
||||||
|
|
Binary file not shown.
168
dtime_now.c
168
dtime_now.c
|
@ -1,5 +1,8 @@
|
||||||
|
|
||||||
#include "direwolf.h"
|
#include "direwolf.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "textcolor.h"
|
#include "textcolor.h"
|
||||||
#include "dtime_now.h"
|
#include "dtime_now.h"
|
||||||
|
|
||||||
|
@ -18,7 +21,25 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
* Name: dtime_now
|
||||||
|
*
|
||||||
|
* Purpose: Return current time as double precision.
|
||||||
|
*
|
||||||
|
* Input: none
|
||||||
|
*
|
||||||
|
* Returns: Unix time, as double precision, so we can get resolution
|
||||||
|
* finer than one second.
|
||||||
|
*
|
||||||
|
* Description: Normal unix time is in seconds since 1/1/1970 00:00:00 UTC.
|
||||||
|
* Sometimes we want resolution finer than a second.
|
||||||
|
* Rather than having a separate variable for the fractional
|
||||||
|
* part of a second, and having extra calculations everywhere,
|
||||||
|
* simply use double precision floating point to make usage
|
||||||
|
* easier.
|
||||||
|
*
|
||||||
|
*---------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
double dtime_now (void)
|
double dtime_now (void)
|
||||||
|
@ -59,3 +80,148 @@ double dtime_now (void)
|
||||||
|
|
||||||
return (result);
|
return (result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if __WIN32__
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Windows doesn't have localtime_r.
|
||||||
|
* It should have the equivalent localtime_s, with opposite parameter
|
||||||
|
* order, but I get undefined reference when trying to use it.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static struct tm *localtime_r(time_t *clock, struct tm *res)
|
||||||
|
{
|
||||||
|
struct tm *tm;
|
||||||
|
|
||||||
|
tm = localtime (clock);
|
||||||
|
memcpy (res, tm, sizeof(struct tm));
|
||||||
|
return (res);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
* Name: timestamp_now
|
||||||
|
*
|
||||||
|
* Purpose: Convert local time to one of these formats for debug output.
|
||||||
|
*
|
||||||
|
* HH:MM:SS
|
||||||
|
* HH:MM:SS.mmm
|
||||||
|
*
|
||||||
|
* Input: result_size - Size of result location.
|
||||||
|
* Should be at least 9 or 13.
|
||||||
|
*
|
||||||
|
* show_ms - True to display milliseconds.
|
||||||
|
*
|
||||||
|
* Output: result - Result is placed here.
|
||||||
|
*
|
||||||
|
*---------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void timestamp_now (char *result, int result_size, int show_ms)
|
||||||
|
{
|
||||||
|
double now = dtime_now();
|
||||||
|
time_t t = (int)now;
|
||||||
|
struct tm tm;
|
||||||
|
|
||||||
|
localtime_r (&t, &tm);
|
||||||
|
strftime (result, result_size, "%H:%M:%S", &tm);
|
||||||
|
|
||||||
|
if (show_ms) {
|
||||||
|
int ms = (now - (int)t) * 1000;
|
||||||
|
char strms[16];
|
||||||
|
|
||||||
|
if (ms == 1000) ms = 999;
|
||||||
|
sprintf (strms, ".%03d", ms);
|
||||||
|
strlcat (result, strms, result_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
} /* end timestamp_now */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
* Name: timestamp_user_format
|
||||||
|
*
|
||||||
|
* Purpose: Convert local time user-specified format. e.g.
|
||||||
|
*
|
||||||
|
* HH:MM:SS
|
||||||
|
* mm/dd/YYYY HH:MM:SS
|
||||||
|
* dd/mm/YYYY HH:MM:SS
|
||||||
|
*
|
||||||
|
* Input: result_size - Size of result location.
|
||||||
|
*
|
||||||
|
* user_format - See strftime documentation.
|
||||||
|
*
|
||||||
|
* https://linux.die.net/man/3/strftime
|
||||||
|
* https://msdn.microsoft.com/en-us/library/aa272978(v=vs.60).aspx
|
||||||
|
*
|
||||||
|
* Note that Windows does not support all of the Linux formats.
|
||||||
|
* For example, Linux has %T which is equivalent to %H:%M:%S
|
||||||
|
*
|
||||||
|
* Output: result - Result is placed here.
|
||||||
|
*
|
||||||
|
*---------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void timestamp_user_format (char *result, int result_size, char *user_format)
|
||||||
|
{
|
||||||
|
double now = dtime_now();
|
||||||
|
time_t t = (int)now;
|
||||||
|
struct tm tm;
|
||||||
|
|
||||||
|
localtime_r (&t, &tm);
|
||||||
|
strftime (result, result_size, user_format, &tm);
|
||||||
|
|
||||||
|
} /* end timestamp_user_format */
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
* Name: timestamp_filename
|
||||||
|
*
|
||||||
|
* Purpose: Generate unique file name based on the current time.
|
||||||
|
* The format will be:
|
||||||
|
*
|
||||||
|
* YYYYMMDD-HHMMSS-mmm
|
||||||
|
*
|
||||||
|
* Input: result_size - Size of result location.
|
||||||
|
* Should be at least 20.
|
||||||
|
*
|
||||||
|
* Output: result - Result is placed here.
|
||||||
|
*
|
||||||
|
* Description: This is for the kissutil "-r" option which places
|
||||||
|
* each received frame in a new file. It is possible to
|
||||||
|
* have two packets arrive in less than a second so we
|
||||||
|
* need more than one second resolution.
|
||||||
|
*
|
||||||
|
* What if someone wants UTC, rather than local time?
|
||||||
|
* You can simply set an environment variable like this:
|
||||||
|
*
|
||||||
|
* TZ=UTC direwolf
|
||||||
|
*
|
||||||
|
* so it's probably not worth the effort to add another
|
||||||
|
* option.
|
||||||
|
*
|
||||||
|
*---------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void timestamp_filename (char *result, int result_size)
|
||||||
|
{
|
||||||
|
double now = dtime_now();
|
||||||
|
time_t t = (int)now;
|
||||||
|
struct tm tm;
|
||||||
|
|
||||||
|
localtime_r (&t, &tm);
|
||||||
|
strftime (result, result_size, "%Y%m%d-%H%M%S", &tm);
|
||||||
|
|
||||||
|
int ms = (now - (int)t) * 1000;
|
||||||
|
char strms[16];
|
||||||
|
|
||||||
|
if (ms == 1000) ms = 999;
|
||||||
|
sprintf (strms, "-%03d", ms);
|
||||||
|
strlcat (result, strms, result_size);
|
||||||
|
|
||||||
|
} /* end timestamp_filename */
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,9 @@
|
||||||
|
|
||||||
|
|
||||||
extern double dtime_now (void);
|
extern double dtime_now (void);
|
||||||
|
|
||||||
|
void timestamp_now (char *result, int result_size, int show_ms);
|
||||||
|
|
||||||
|
void timestamp_user_format (char *result, int result_size, char *user_format);
|
||||||
|
|
||||||
|
void timestamp_filename (char *result, int result_size);
|
92
kissutil.c
92
kissutil.c
|
@ -35,8 +35,6 @@
|
||||||
* See the "usage" functions at the bottom for details.
|
* See the "usage" functions at the bottom for details.
|
||||||
*
|
*
|
||||||
* FIXME: This is a rough prototype that needs more work.
|
* FIXME: This is a rough prototype that needs more work.
|
||||||
* TODO: Prepare the "man" page.
|
|
||||||
* TODO: Add to User Guide.
|
|
||||||
*
|
*
|
||||||
*---------------------------------------------------------------*/
|
*---------------------------------------------------------------*/
|
||||||
|
|
||||||
|
@ -137,16 +135,20 @@ static int serial_speed = 9600; /* -s option. */
|
||||||
static int verbose = 0; /* -v option. */
|
static int verbose = 0; /* -v option. */
|
||||||
/* Display the KISS protocol in hexadecimal for troubleshooting. */
|
/* Display the KISS protocol in hexadecimal for troubleshooting. */
|
||||||
|
|
||||||
static char transmit_queue[120] = ""; /* -t option */
|
static char transmit_from[120] = ""; /* -f option */
|
||||||
/* When specified, files are read from this directory */
|
/* When specified, files are read from this directory */
|
||||||
/* rather than using stdin. Each file is one or more */
|
/* rather than using stdin. Each file is one or more */
|
||||||
/* lines in the standard monitoring format. */
|
/* lines in the standard monitoring format. */
|
||||||
|
|
||||||
static char receive_queue[120] = ""; /* -r option */
|
static char receive_output[120] = ""; /* -o option */
|
||||||
/* When specified, each received frame is stored as a file */
|
/* When specified, each received frame is stored as a file */
|
||||||
/* with a unique name here. */
|
/* with a unique name here. */
|
||||||
/* Directory must already exist; we won't create it. */
|
/* Directory must already exist; we won't create it. */
|
||||||
|
|
||||||
|
static char timestamp_format[60] = ""; /* -T option */
|
||||||
|
/* Precede received frames with timestamp. */
|
||||||
|
/* Command line option uses "strftime" format string. */
|
||||||
|
|
||||||
|
|
||||||
#if __WIN32__
|
#if __WIN32__
|
||||||
#define THREAD_F unsigned __stdcall
|
#define THREAD_F unsigned __stdcall
|
||||||
|
@ -213,7 +215,7 @@ int main (int argc, char *argv[])
|
||||||
|
|
||||||
/* ':' following option character means arg is required. */
|
/* ':' following option character means arg is required. */
|
||||||
|
|
||||||
c = getopt_long(argc, argv, "h:p:s:vt:r:",
|
c = getopt_long(argc, argv, "h:p:s:vf:o:T:",
|
||||||
long_options, &option_index);
|
long_options, &option_index);
|
||||||
if (c == -1)
|
if (c == -1)
|
||||||
break;
|
break;
|
||||||
|
@ -236,12 +238,16 @@ int main (int argc, char *argv[])
|
||||||
verbose++;
|
verbose++;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 't': /* -t for transmit queue directory. */
|
case 'f': /* -f for transmit files directory. */
|
||||||
strlcpy (transmit_queue, optarg, sizeof(transmit_queue));
|
strlcpy (transmit_from, optarg, sizeof(transmit_from));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'r': /* -t for receive queue directory. */
|
case 'o': /* -o for receive output directory. */
|
||||||
strlcpy (receive_queue, optarg, sizeof(receive_queue));
|
strlcpy (receive_output, optarg, sizeof(receive_output));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'T': /* -T for receive timestamp. */
|
||||||
|
strlcpy (timestamp_format, optarg, sizeof(timestamp_format));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '?':
|
case '?':
|
||||||
|
@ -265,9 +271,9 @@ int main (int argc, char *argv[])
|
||||||
/*
|
/*
|
||||||
* If receive queue directory was specified, make sure that it exists.
|
* If receive queue directory was specified, make sure that it exists.
|
||||||
*/
|
*/
|
||||||
if (strlen(receive_queue) > 0) {
|
if (strlen(receive_output) > 0) {
|
||||||
|
|
||||||
|
|
||||||
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If port begins with digit, consider it to be TCP. */
|
/* If port begins with digit, consider it to be TCP. */
|
||||||
|
@ -304,7 +310,7 @@ int main (int argc, char *argv[])
|
||||||
*/
|
*/
|
||||||
char stuff[1000];
|
char stuff[1000];
|
||||||
|
|
||||||
if (strlen(transmit_queue) > 0) {
|
if (strlen(transmit_from) > 0) {
|
||||||
/*
|
/*
|
||||||
* Process and delete all files in specified directory.
|
* Process and delete all files in specified directory.
|
||||||
* When done, sleep for a second and try again.
|
* When done, sleep for a second and try again.
|
||||||
|
@ -318,7 +324,7 @@ int main (int argc, char *argv[])
|
||||||
//text_color_set(DW_COLOR_DEBUG);
|
//text_color_set(DW_COLOR_DEBUG);
|
||||||
//dw_printf("Get directory listing...\n");
|
//dw_printf("Get directory listing...\n");
|
||||||
|
|
||||||
dp = opendir (transmit_queue);
|
dp = opendir (transmit_from);
|
||||||
if (dp != NULL) {
|
if (dp != NULL) {
|
||||||
while ((ep = readdir(dp)) != NULL) {
|
while ((ep = readdir(dp)) != NULL) {
|
||||||
char path [300];
|
char path [300];
|
||||||
|
@ -328,7 +334,7 @@ int main (int argc, char *argv[])
|
||||||
|
|
||||||
text_color_set(DW_COLOR_DEBUG);
|
text_color_set(DW_COLOR_DEBUG);
|
||||||
dw_printf ("Processing %s for transmit...\n", ep->d_name);
|
dw_printf ("Processing %s for transmit...\n", ep->d_name);
|
||||||
strlcpy (path, transmit_queue, sizeof(path));
|
strlcpy (path, transmit_from, sizeof(path));
|
||||||
strlcat (path, DIR_CHAR, sizeof(path));
|
strlcat (path, DIR_CHAR, sizeof(path));
|
||||||
strlcat (path, ep->d_name, sizeof(path));
|
strlcat (path, ep->d_name, sizeof(path));
|
||||||
fp = fopen (path, "r");
|
fp = fopen (path, "r");
|
||||||
|
@ -352,7 +358,7 @@ int main (int argc, char *argv[])
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
text_color_set(DW_COLOR_ERROR);
|
text_color_set(DW_COLOR_ERROR);
|
||||||
dw_printf("Can't access transmit queue directory %s. Quitting.\n", transmit_queue);
|
dw_printf("Can't access transmit queue directory %s. Quitting.\n", transmit_from);
|
||||||
exit (EXIT_FAILURE);
|
exit (EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
SLEEP_SEC (1);
|
SLEEP_SEC (1);
|
||||||
|
@ -367,6 +373,8 @@ int main (int argc, char *argv[])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return (EXIT_SUCCESS);
|
||||||
|
|
||||||
} /* end main */
|
} /* end main */
|
||||||
|
|
||||||
|
|
||||||
|
@ -572,6 +580,9 @@ static THREAD_F tnc_listen_net (void *arg)
|
||||||
/*
|
/*
|
||||||
* Connect to network KISS TNC.
|
* Connect to network KISS TNC.
|
||||||
*/
|
*/
|
||||||
|
// For the IGate we would loop around and try to reconnect if the TNC
|
||||||
|
// goes away. We should probably do the same here.
|
||||||
|
|
||||||
server_sock = sock_connect (hostname, port, "TCP KISS TNC", allow_ipv6, debug, ipaddr_str);
|
server_sock = sock_connect (hostname, port, "TCP KISS TNC", allow_ipv6, debug, ipaddr_str);
|
||||||
|
|
||||||
if (server_sock == -1) {
|
if (server_sock == -1) {
|
||||||
|
@ -609,9 +620,6 @@ static THREAD_F tnc_listen_net (void *arg)
|
||||||
dw_printf ("Read error from TCP KISS TNC. Terminating.\n");
|
dw_printf ("Read error from TCP KISS TNC. Terminating.\n");
|
||||||
exit (EXIT_FAILURE);
|
exit (EXIT_FAILURE);
|
||||||
|
|
||||||
// For the IGate we would loop around and try to reconnect but
|
|
||||||
// it doesn't seem appropriate here. Just quit.
|
|
||||||
|
|
||||||
} /* end tnc_listen_net */
|
} /* end tnc_listen_net */
|
||||||
|
|
||||||
|
|
||||||
|
@ -711,21 +719,29 @@ void kiss_process_msg (unsigned char *kiss_msg, int kiss_len, int debug, int cli
|
||||||
printf ("ERROR - Invalid KISS data frame from TNC.\n");
|
printf ("ERROR - Invalid KISS data frame from TNC.\n");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
char addrs[500];
|
char prefix[100]; // Channel and optional timestamp.
|
||||||
|
// Like [0] or [2 12:34:56]
|
||||||
|
|
||||||
|
char addrs[AX25_MAX_ADDRS*AX25_MAX_ADDR_LEN]; // Like source>dest,digi,...,digi:
|
||||||
unsigned char *pinfo;
|
unsigned char *pinfo;
|
||||||
int info_len;
|
int info_len;
|
||||||
|
|
||||||
|
if (strlen(timestamp_format) > 0) {
|
||||||
|
char ts[100];
|
||||||
|
timestamp_user_format (ts, sizeof(ts), timestamp_format);
|
||||||
|
snprintf (prefix, sizeof(prefix), "[%d %s]", chan, ts);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
snprintf (prefix, sizeof(prefix), "[%d]", chan);
|
||||||
|
}
|
||||||
|
|
||||||
ax25_format_addrs (pp, addrs);
|
ax25_format_addrs (pp, addrs);
|
||||||
|
|
||||||
info_len = ax25_get_info (pp, &pinfo);
|
info_len = ax25_get_info (pp, &pinfo);
|
||||||
|
|
||||||
text_color_set(DW_COLOR_REC);
|
text_color_set(DW_COLOR_REC);
|
||||||
|
|
||||||
if (chan != 0) {
|
dw_printf ("%s %s", prefix, addrs); // [channel] Addresses followed by :
|
||||||
dw_printf ("[%d] ", chan);
|
|
||||||
}
|
|
||||||
|
|
||||||
dw_printf ("%s", addrs); /* stations followed by : */
|
|
||||||
|
|
||||||
// Safe print will replace any unprintable characters with
|
// Safe print will replace any unprintable characters with
|
||||||
// hexadecimal representation.
|
// hexadecimal representation.
|
||||||
|
@ -735,24 +751,27 @@ void kiss_process_msg (unsigned char *kiss_msg, int kiss_len, int debug, int cli
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Add to receive queue directory if specified.
|
* Add to receive queue directory if specified.
|
||||||
* File name will be based on time to 0.01 sec resolution. ??? TBD
|
* File name will be based on current local time.
|
||||||
|
* If you want UTC, just set an environment variable like this:
|
||||||
|
*
|
||||||
|
* TZ=UTC kissutil ...
|
||||||
*/
|
*/
|
||||||
if (strlen(receive_queue) > 0) {
|
if (strlen(receive_output) > 0) {
|
||||||
char fname [30];
|
char fname [30];
|
||||||
char path [300];
|
char path [300];
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
|
||||||
snprintf (fname, sizeof(fname), "%.0f", dtime_now() * 100.);
|
timestamp_filename (fname, (int)sizeof(fname));
|
||||||
|
|
||||||
strlcpy (path, receive_queue, sizeof(path));
|
strlcpy (path, receive_output, sizeof(path));
|
||||||
strlcat (path, DIR_CHAR, sizeof(path));
|
strlcat (path, DIR_CHAR, sizeof(path));
|
||||||
strlcat (path, fname, sizeof(path));
|
strlcat (path, fname, sizeof(path));
|
||||||
|
|
||||||
text_color_set(DW_COLOR_DEBUG);
|
text_color_set(DW_COLOR_DEBUG);
|
||||||
dw_printf ("save received frame to %s\n", path);
|
dw_printf ("Save received frame to %s\n", path);
|
||||||
fp = fopen (path, "w");
|
fp = fopen (path, "w");
|
||||||
if (fp != NULL) {
|
if (fp != NULL) {
|
||||||
fprintf (fp, "%s%s\n", addrs, pinfo);
|
fprintf (fp, "%s %s%s\n", prefix, addrs, pinfo);
|
||||||
fclose (fp);
|
fclose (fp);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -769,10 +788,14 @@ void kiss_process_msg (unsigned char *kiss_msg, int kiss_len, int debug, int cli
|
||||||
|
|
||||||
kiss_msg[kiss_len] = '\0';
|
kiss_msg[kiss_len] = '\0';
|
||||||
text_color_set(DW_COLOR_REC);
|
text_color_set(DW_COLOR_REC);
|
||||||
// TODO: Just precede by "h " for in/out symmetry?
|
// Display as "h ..." for in/out symmetry.
|
||||||
printf ("KISS protocol set hardware \"%s\", channel %d\n", (char*)(kiss_msg+1), chan);
|
// Use safe print here?
|
||||||
|
dw_printf ("[%d] h %s\n", chan, (char*)(kiss_msg+1));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The rest should only go TO the TNC and not come FROM it.
|
||||||
|
*/
|
||||||
case KISS_CMD_TXDELAY: /* 1 = TXDELAY */
|
case KISS_CMD_TXDELAY: /* 1 = TXDELAY */
|
||||||
case KISS_CMD_PERSISTENCE: /* 2 = Persistence */
|
case KISS_CMD_PERSISTENCE: /* 2 = Persistence */
|
||||||
case KISS_CMD_SLOTTIME: /* 3 = SlotTime */
|
case KISS_CMD_SLOTTIME: /* 3 = SlotTime */
|
||||||
|
@ -833,8 +856,9 @@ static void usage(void)
|
||||||
dw_printf (" a serial port. e.g. /dev/ttyAMA0 or COM3.\n");
|
dw_printf (" a serial port. e.g. /dev/ttyAMA0 or COM3.\n");
|
||||||
dw_printf (" -s Serial port speed, default 9600.\n");
|
dw_printf (" -s Serial port speed, default 9600.\n");
|
||||||
dw_printf (" -v Verbose. Show the KISS frame contents.\n");
|
dw_printf (" -v Verbose. Show the KISS frame contents.\n");
|
||||||
dw_printf (" -t Transmit queue directory. Processs and delete files here.\n");
|
dw_printf (" -f Transmit files directory. Processs and delete files here.\n");
|
||||||
dw_printf (" -r Receive queue directory. Store received frames here.\n");
|
dw_printf (" -o Receive output queue directory. Store received frames here.\n");
|
||||||
|
dw_printf (" -T Precede received frames with 'strftime' format time stamp.\n");
|
||||||
usage2();
|
usage2();
|
||||||
exit (EXIT_SUCCESS);
|
exit (EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,5 +48,5 @@ of how to set up tests and the results.
|
||||||
.SH SEE ALSO
|
.SH SEE ALSO
|
||||||
More detailed information is in the pdf files in /usr/local/share/doc/direwolf, or possibly /usr/share/doc/direwolf, depending on installation location.
|
More detailed information is in the pdf files in /usr/local/share/doc/direwolf, or possibly /usr/share/doc/direwolf, depending on installation location.
|
||||||
|
|
||||||
Applications in this package: aclients, atest, decode_aprs, direwolf, gen_packets, ll2utm, log2gpx, text2tt, tt2text, utm2ll
|
Applications in this package: aclients, atest, decode_aprs, direwolf, gen_packets, kissutil, ll2utm, log2gpx, text2tt, tt2text, utm2ll
|
||||||
|
|
||||||
|
|
|
@ -87,5 +87,5 @@ Try different combinations of options to find the best decoding performance.
|
||||||
.SH SEE ALSO
|
.SH SEE ALSO
|
||||||
More detailed information is in the pdf files in /usr/local/share/doc/direwolf, or possibly /usr/share/doc/direwolf, depending on installation location.
|
More detailed information is in the pdf files in /usr/local/share/doc/direwolf, or possibly /usr/share/doc/direwolf, depending on installation location.
|
||||||
|
|
||||||
Applications in this package: aclients, atest, decode_aprs, direwolf, gen_packets, ll2utm, log2gpx, text2tt, tt2text, utm2ll
|
Applications in this package: aclients, atest, decode_aprs, direwolf, gen_packets, kissutil, ll2utm, log2gpx, text2tt, tt2text, utm2ll
|
||||||
|
|
||||||
|
|
|
@ -152,5 +152,5 @@ rtl_fm \-f 144.39M \-o 4 \- | direwolf \-n 1 \-r 24000 \-b 16 \-
|
||||||
.SH SEE ALSO
|
.SH SEE ALSO
|
||||||
More detailed information is in the pdf files in /usr/local/share/doc/direwolf, or possibly /usr/share/doc/direwolf, depending on installation location.
|
More detailed information is in the pdf files in /usr/local/share/doc/direwolf, or possibly /usr/share/doc/direwolf, depending on installation location.
|
||||||
|
|
||||||
Applications in this package: aclients, atest, decode_aprs, direwolf, gen_packets, ll2utm, log2gpx, text2tt, tt2text, utm2ll
|
Applications in this package: aclients, atest, decode_aprs, direwolf, gen_packets, kissutil, ll2utm, log2gpx, text2tt, tt2text, utm2ll
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
.TH KISSUTIL 1
|
||||||
|
|
||||||
|
.SH NAME
|
||||||
|
kissutil \- KISS TNC troubleshooting and Application Interface.
|
||||||
|
|
||||||
|
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B kissutil
|
||||||
|
[ \fIoptions\fR ]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.SH DESCRIPTION
|
||||||
|
\fBkissutil\fR can be used interactively for troubleshooting a KISS TNC.
|
||||||
|
It is usable with direwolf and other generic KISS TNCs connected to a serial port.
|
||||||
|
It can also be used as an application interface where each side places files in a
|
||||||
|
directory for the other to process.
|
||||||
|
See User Guide for more details.
|
||||||
|
|
||||||
|
|
||||||
|
.SH OPTIONS
|
||||||
|
.TP
|
||||||
|
.BI "-h " "host"
|
||||||
|
Hostname or IP address for a TCP KISS TNC. Default is localhost.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.BI "-p " "port"
|
||||||
|
A number may be specified for a TCP port other than the default 8001.
|
||||||
|
If not a number, it is considered to be a serial port name such as /dev/ttyS0 or COM3.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.BI "-s " "speed"
|
||||||
|
Speed for serial port. e.g. 9600.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.BI "-o " "rec-directory"
|
||||||
|
For each received frame, a new file is created here.
|
||||||
|
It is expected that some other application will process files in this directory then delete them.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.BI "-T " "format"
|
||||||
|
Each received frame will be preceded by a timestamp in the specified format.
|
||||||
|
See strftime documentation for a description of the format string.
|
||||||
|
Example: %H:%M:%S for current time in hours, minutes, seconds.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.BI "-f " "xmit-directory"
|
||||||
|
Files in this directory are transmited and deleted.
|
||||||
|
Another application places a file here when it wants something to be transmitted.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.BI "-v "
|
||||||
|
Verbose - Display the KISS frames going to and from the TNC.
|
||||||
|
|
||||||
|
|
||||||
|
.SH SEE ALSO
|
||||||
|
More detailed information is in the pdf files in /usr/local/share/doc/direwolf, or possibly /usr/share/doc/direwolf, depending on installation location.
|
||||||
|
|
||||||
|
Applications in this package: aclients, atest, decode_aprs, direwolf, gen_packets, kissutil, ll2utm, log2gpx, text2tt, tt2text, utm2ll
|
||||||
|
|
|
@ -30,5 +30,5 @@ zone = 19T, easting = 307504, northing = 4721177
|
||||||
.SH SEE ALSO
|
.SH SEE ALSO
|
||||||
More detailed information is in the pdf files in /usr/local/share/doc/direwolf, or possibly /usr/share/doc/direwolf, depending on installation location.
|
More detailed information is in the pdf files in /usr/local/share/doc/direwolf, or possibly /usr/share/doc/direwolf, depending on installation location.
|
||||||
|
|
||||||
Applications in this package: aclients, atest, decode_aprs, direwolf, gen_packets, ll2utm, log2gpx, text2tt, tt2text, utm2ll
|
Applications in this package: aclients, atest, decode_aprs, direwolf, gen_packets, kissutil, ll2utm, log2gpx, text2tt, tt2text, utm2ll
|
||||||
|
|
||||||
|
|
|
@ -36,5 +36,5 @@ None.
|
||||||
.SH SEE ALSO
|
.SH SEE ALSO
|
||||||
More detailed information is in the pdf files in /usr/local/share/doc/direwolf, or possibly /usr/share/doc/direwolf, depending on installation location.
|
More detailed information is in the pdf files in /usr/local/share/doc/direwolf, or possibly /usr/share/doc/direwolf, depending on installation location.
|
||||||
|
|
||||||
Applications in this package: aclients, atest, decode_aprs, direwolf, gen_packets, ll2utm, log2gpx, text2tt, tt2text, utm2ll
|
Applications in this package: aclients, atest, decode_aprs, direwolf, gen_packets, kissutil, ll2utm, log2gpx, text2tt, tt2text, utm2ll
|
||||||
|
|
||||||
|
|
|
@ -60,5 +60,5 @@ Push buttons for two-key method:
|
||||||
.SH SEE ALSO
|
.SH SEE ALSO
|
||||||
More detailed information is in the pdf files in /usr/local/share/doc/direwolf, or possibly /usr/share/doc/direwolf, depending on installation location.
|
More detailed information is in the pdf files in /usr/local/share/doc/direwolf, or possibly /usr/share/doc/direwolf, depending on installation location.
|
||||||
|
|
||||||
Applications in this package: aclients, atest, decode_aprs, direwolf, gen_packets, ll2utm, log2gpx, text2tt, tt2text, utm2ll
|
Applications in this package: aclients, atest, decode_aprs, direwolf, gen_packets, kissutil, ll2utm, log2gpx, text2tt, tt2text, utm2ll
|
||||||
|
|
||||||
|
|
|
@ -62,5 +62,5 @@ Decoded text from two-key method:
|
||||||
.SH SEE ALSO
|
.SH SEE ALSO
|
||||||
More detailed information is in the pdf files in /usr/local/share/doc/direwolf, or possibly /usr/share/doc/direwolf, depending on installation location.
|
More detailed information is in the pdf files in /usr/local/share/doc/direwolf, or possibly /usr/share/doc/direwolf, depending on installation location.
|
||||||
|
|
||||||
Applications in this package: aclients, atest, decode_aprs, direwolf, gen_packets, ll2utm, log2gpx, text2tt, tt2text, utm2ll
|
Applications in this package: aclients, atest, decode_aprs, direwolf, gen_packets, kissutil, ll2utm, log2gpx, text2tt, tt2text, utm2ll
|
||||||
|
|
||||||
|
|
|
@ -36,5 +36,5 @@ latitude = 42.662139, longitude = -71.365553
|
||||||
.SH SEE ALSO
|
.SH SEE ALSO
|
||||||
More detailed information is in the pdf files in /usr/local/share/doc/direwolf, or possibly /usr/share/doc/direwolf, depending on installation location.
|
More detailed information is in the pdf files in /usr/local/share/doc/direwolf, or possibly /usr/share/doc/direwolf, depending on installation location.
|
||||||
|
|
||||||
Applications in this package: aclients, atest, decode_aprs, direwolf, gen_packets, ll2utm, log2gpx, text2tt, tt2text, utm2ll
|
Applications in this package: aclients, atest, decode_aprs, direwolf, gen_packets, kissutil, ll2utm, log2gpx, text2tt, tt2text, utm2ll
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue