kopia lustrzana https://github.com/Hamlib/Hamlib
Implement next phase of threaded rig_send_morse
rodzic
fda5b984e7
commit
af506f8e15
|
@ -48,6 +48,7 @@ int main()
|
||||||
|
|
||||||
// Popping and printing one character at a time
|
// Popping and printing one character at a time
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
while ((c = pop(&fifo)) != -1)
|
while ((c = pop(&fifo)) != -1)
|
||||||
{
|
{
|
||||||
printf("%c", c);
|
printf("%c", c);
|
||||||
|
|
|
@ -1337,7 +1337,10 @@ static int read_string_generic(hamlib_port_t *p,
|
||||||
{
|
{
|
||||||
ssize_t rd_count = 0;
|
ssize_t rd_count = 0;
|
||||||
int result;
|
int result;
|
||||||
|
int timeout_save = p->timeout;
|
||||||
|
p->timeout = 2;
|
||||||
result = port_wait_for_data(p, direct);
|
result = port_wait_for_data(p, direct);
|
||||||
|
p->timeout = timeout_save;
|
||||||
|
|
||||||
if (result == -RIG_ETIMEOUT)
|
if (result == -RIG_ETIMEOUT)
|
||||||
{
|
{
|
||||||
|
|
142
src/rig.c
142
src/rig.c
|
@ -1,3 +1,4 @@
|
||||||
|
Add current_vfo to cache debug statementy
|
||||||
/*
|
/*
|
||||||
* Hamlib Interface - main file
|
* Hamlib Interface - main file
|
||||||
* Copyright (c) 2021 by Mikael Nousiainen
|
* Copyright (c) 2021 by Mikael Nousiainen
|
||||||
|
@ -51,6 +52,7 @@
|
||||||
|
|
||||||
#include "hamlib/rig.h"
|
#include "hamlib/rig.h"
|
||||||
#include "hamlib/config.h"
|
#include "hamlib/config.h"
|
||||||
|
#include "fifo.h"
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
@ -240,6 +242,22 @@ static int async_data_handler_stop(RIG *rig);
|
||||||
void *async_data_handler(void *arg);
|
void *async_data_handler(void *arg);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
typedef struct morse_data_handler_args_s
|
||||||
|
{
|
||||||
|
RIG *rig;
|
||||||
|
} morse_data_handler_args;
|
||||||
|
|
||||||
|
typedef struct morse_data_handler_priv_data_s
|
||||||
|
{
|
||||||
|
pthread_t thread_id;
|
||||||
|
morse_data_handler_args args;
|
||||||
|
FIFO fifo;
|
||||||
|
} morse_data_handler_priv_data;
|
||||||
|
|
||||||
|
static int morse_data_handler_start(RIG *rig);
|
||||||
|
static int morse_data_handler_stop(RIG *rig);
|
||||||
|
void *morse_data_handler(void *arg);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* track which rig is opened (with rig_open)
|
* track which rig is opened (with rig_open)
|
||||||
* needed at least for transceive mode
|
* needed at least for transceive mode
|
||||||
|
@ -563,7 +581,7 @@ RIG *HAMLIB_API rig_init(rig_model_t rig_model)
|
||||||
|
|
||||||
rs->rig_model = caps->rig_model;
|
rs->rig_model = caps->rig_model;
|
||||||
rs->priv = NULL;
|
rs->priv = NULL;
|
||||||
rs->async_data_enabled = 1;
|
// rs->async_data_enabled = 1;
|
||||||
rs->rigport.fd = -1;
|
rs->rigport.fd = -1;
|
||||||
rs->pttport.fd = -1;
|
rs->pttport.fd = -1;
|
||||||
rs->comm_state = 0;
|
rs->comm_state = 0;
|
||||||
|
@ -1303,6 +1321,16 @@ int HAMLIB_API rig_open(RIG *rig)
|
||||||
rs->comm_state);
|
rs->comm_state);
|
||||||
hl_usleep(100 * 1000); // wait a bit after opening to give some serial ports time
|
hl_usleep(100 * 1000); // wait a bit after opening to give some serial ports time
|
||||||
|
|
||||||
|
status = morse_data_handler_start(rig);
|
||||||
|
|
||||||
|
if (status < 0)
|
||||||
|
{
|
||||||
|
rig_debug(RIG_DEBUG_ERR, "%s: cw_data_handler_start failed: %s\n", __func__, rigerror(status));
|
||||||
|
port_close(&rs->rigport, rs->rigport.type.rig);
|
||||||
|
RETURNFUNC2(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Maybe the backend has something to initialize
|
* Maybe the backend has something to initialize
|
||||||
* In case of failure, just close down and report error code.
|
* In case of failure, just close down and report error code.
|
||||||
|
@ -1344,6 +1372,7 @@ int HAMLIB_API rig_open(RIG *rig)
|
||||||
{
|
{
|
||||||
remove_opened_rig(rig);
|
remove_opened_rig(rig);
|
||||||
async_data_handler_stop(rig);
|
async_data_handler_stop(rig);
|
||||||
|
morse_data_handler_stop(rig);
|
||||||
port_close(&rs->rigport, rs->rigport.type.rig);
|
port_close(&rs->rigport, rs->rigport.type.rig);
|
||||||
memcpy(&rs->rigport_deprecated, &rs->rigport, sizeof(hamlib_port_t_deprecated));
|
memcpy(&rs->rigport_deprecated, &rs->rigport, sizeof(hamlib_port_t_deprecated));
|
||||||
rs->comm_state = 0;
|
rs->comm_state = 0;
|
||||||
|
@ -1494,6 +1523,7 @@ int HAMLIB_API rig_close(RIG *rig)
|
||||||
caps->rig_close(rig);
|
caps->rig_close(rig);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
morse_data_handler_stop(rig);
|
||||||
async_data_handler_stop(rig);
|
async_data_handler_stop(rig);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -7741,6 +7771,39 @@ static int async_data_handler_start(RIG *rig)
|
||||||
RETURNFUNC(RIG_OK);
|
RETURNFUNC(RIG_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int morse_data_handler_start(RIG *rig)
|
||||||
|
{
|
||||||
|
struct rig_state *rs = &rig->state;
|
||||||
|
morse_data_handler_priv_data *morse_data_handler_priv;
|
||||||
|
|
||||||
|
ENTERFUNC;
|
||||||
|
|
||||||
|
rs->morse_data_handler_thread_run = 1;
|
||||||
|
rs->morse_data_handler_priv_data = calloc(1,
|
||||||
|
sizeof(morse_data_handler_priv_data));
|
||||||
|
|
||||||
|
if (rs->morse_data_handler_priv_data == NULL)
|
||||||
|
{
|
||||||
|
RETURNFUNC(-RIG_ENOMEM);
|
||||||
|
}
|
||||||
|
|
||||||
|
morse_data_handler_priv = (morse_data_handler_priv_data *)
|
||||||
|
rs->morse_data_handler_priv_data;
|
||||||
|
morse_data_handler_priv->args.rig = rig;
|
||||||
|
int err = pthread_create(&morse_data_handler_priv->thread_id, NULL,
|
||||||
|
morse_data_handler, &morse_data_handler_priv->args);
|
||||||
|
|
||||||
|
if (err)
|
||||||
|
{
|
||||||
|
rig_debug(RIG_DEBUG_ERR, "%s: pthread_create error: %s\n", __func__,
|
||||||
|
strerror(errno));
|
||||||
|
RETURNFUNC(-RIG_EINTERNAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
RETURNFUNC(RIG_OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int async_data_handler_stop(RIG *rig)
|
static int async_data_handler_stop(RIG *rig)
|
||||||
{
|
{
|
||||||
struct rig_state *rs = &rig->state;
|
struct rig_state *rs = &rig->state;
|
||||||
|
@ -7782,6 +7845,45 @@ static int async_data_handler_stop(RIG *rig)
|
||||||
RETURNFUNC(RIG_OK);
|
RETURNFUNC(RIG_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int morse_data_handler_stop(RIG *rig)
|
||||||
|
{
|
||||||
|
struct rig_state *rs = &rig->state;
|
||||||
|
morse_data_handler_priv_data *morse_data_handler_priv;
|
||||||
|
|
||||||
|
ENTERFUNC;
|
||||||
|
|
||||||
|
rs->morse_data_handler_thread_run = 0;
|
||||||
|
|
||||||
|
morse_data_handler_priv = (morse_data_handler_priv_data *)
|
||||||
|
rs->morse_data_handler_priv_data;
|
||||||
|
|
||||||
|
if (morse_data_handler_priv != NULL)
|
||||||
|
{
|
||||||
|
if (morse_data_handler_priv->thread_id != 0)
|
||||||
|
{
|
||||||
|
// all cleanup is done in this function so we can kill thread
|
||||||
|
// Windows was taking 30 seconds to stop without this
|
||||||
|
pthread_cancel(morse_data_handler_priv->thread_id);
|
||||||
|
int err = pthread_join(morse_data_handler_priv->thread_id, NULL);
|
||||||
|
|
||||||
|
if (err)
|
||||||
|
{
|
||||||
|
rig_debug(RIG_DEBUG_ERR, "%s: pthread_join error: %s\n", __func__,
|
||||||
|
strerror(errno));
|
||||||
|
// just ignore the error
|
||||||
|
}
|
||||||
|
|
||||||
|
morse_data_handler_priv->thread_id = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(rs->morse_data_handler_priv_data);
|
||||||
|
rs->morse_data_handler_priv_data = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
RETURNFUNC(RIG_OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void *async_data_handler(void *arg)
|
void *async_data_handler(void *arg)
|
||||||
{
|
{
|
||||||
struct async_data_handler_args_s *args = (struct async_data_handler_args_s *)
|
struct async_data_handler_args_s *args = (struct async_data_handler_args_s *)
|
||||||
|
@ -7822,7 +7924,7 @@ void *async_data_handler(void *arg)
|
||||||
__func__, result);
|
__func__, result);
|
||||||
hl_usleep(500 * 1000);
|
hl_usleep(500 * 1000);
|
||||||
}
|
}
|
||||||
|
hl_usleep(10*1000);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7867,6 +7969,40 @@ void *async_data_handler(void *arg)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void *morse_data_handler(void *arg)
|
||||||
|
{
|
||||||
|
struct morse_data_handler_args_s *args = (struct morse_data_handler_args_s *)
|
||||||
|
arg;
|
||||||
|
RIG *rig = args->rig;
|
||||||
|
struct rig_state *rs = &rig->state;
|
||||||
|
int result;
|
||||||
|
FIFO fifo;
|
||||||
|
|
||||||
|
rig_debug(RIG_DEBUG_VERBOSE, "%s: Starting morse data handler thread\n",
|
||||||
|
__func__);
|
||||||
|
|
||||||
|
initFIFO(&fifo);
|
||||||
|
while (rs->morse_data_handler_thread_run)
|
||||||
|
{
|
||||||
|
char c[2];
|
||||||
|
c[1] = 0;
|
||||||
|
while((c[0]=pop(&fifo)!=-1))
|
||||||
|
{
|
||||||
|
result = rig_send_morse(rig, RIG_VFO_CURR, c);
|
||||||
|
if (result != RIG_OK)
|
||||||
|
{
|
||||||
|
rig_debug(RIG_DEBUG_ERR, "%s: error: %s\n", __func__, rigerror(result));
|
||||||
|
push(&fifo, c);
|
||||||
|
hl_usleep(20*1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
hl_usleep(20*1000);
|
||||||
|
}
|
||||||
|
pthread_exit(NULL);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
HAMLIB_EXPORT(int) rig_password(RIG *rig, const char *key1)
|
HAMLIB_EXPORT(int) rig_password(RIG *rig, const char *key1)
|
||||||
{
|
{
|
||||||
int retval = -RIG_EPROTO;
|
int retval = -RIG_EPROTO;
|
||||||
|
@ -8034,3 +8170,5 @@ HAMLIB_EXPORT(int) rig_is_model(RIG *rig, rig_model_t model)
|
||||||
return (is_rig); // RETURN is too verbose here
|
return (is_rig); // RETURN is too verbose here
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue