allow discovery(probe) of more than one rig attached to a port, fixes

git-svn-id: https://hamlib.svn.sourceforge.net/svnroot/hamlib/trunk@1405 7ae35d74-ebe9-4afe-98af-79ac388436b8
Hamlib-1.1.4
Stéphane Fillod, F8CFE 2003-03-10 08:26:09 +00:00
rodzic 825871c328
commit fdabf14513
8 zmienionych plików z 175 dodań i 67 usunięć

Wyświetl plik

@ -1,8 +1,8 @@
/* /*
* Hamlib Drake backend - main file * Hamlib Drake backend - main file
* Copyright (c) 2001,2002 by Stephane Fillod * Copyright (c) 2001-2003 by Stephane Fillod
* *
* $Id: drake.c,v 1.2 2002-10-20 20:46:32 fillods Exp $ * $Id: drake.c,v 1.3 2003-03-10 08:26:08 fillods Exp $
* *
* This library is free software; you can redistribute it and/or modify * This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as * it under the terms of the GNU Library General Public License as
@ -221,7 +221,7 @@ int initrigs_drake(void *be_handle)
/* /*
* probe_drake * probe_drake
*/ */
rig_model_t probe_drake(port_t *port) rig_model_t probeallrigs_drake(port_t *port, rig_probe_func_t cfunc, rig_ptr_t data)
{ {
static unsigned char idbuf[BUFSZ]; static unsigned char idbuf[BUFSZ];
int retval, id_len; int retval, id_len;
@ -229,6 +229,10 @@ rig_model_t probe_drake(port_t *port)
if (!port) if (!port)
return RIG_MODEL_NONE; return RIG_MODEL_NONE;
if (port->type.rig != RIG_PORT_SERIAL)
return RIG_MODEL_NONE;
port->parm.serial.rate = r8b_caps.serial_rate_max;
port->write_delay = port->post_write_delay = 0; port->write_delay = port->post_write_delay = 0;
port->timeout = 50; port->timeout = 50;
port->retry = 1; port->retry = 1;
@ -242,19 +246,22 @@ rig_model_t probe_drake(port_t *port)
close(port->fd); close(port->fd);
if (retval != RIG_OK) if (retval != RIG_OK || id_len <= 0 || id_len >= BUFSZ)
return RIG_MODEL_NONE; return RIG_MODEL_NONE;
idbuf[id_len] = '\0'; idbuf[id_len] = '\0';
if (!strcmp(idbuf, "R8B")) {
if (!strcmp(idbuf, "R8B")) if (cfunc)
(*cfunc)(port, RIG_MODEL_DKR8B, data);
return RIG_MODEL_DKR8B; return RIG_MODEL_DKR8B;
}
/* /*
* not found... * not found...
*/ */
rig_debug(RIG_DEBUG_VERBOSE,"probe_drake: found unknown device " if (memcmp(idbuf, "ID" EOM, 3)) /* catch loopback serial */
rig_debug(RIG_DEBUG_VERBOSE,"probe_drake: found unknown device "
"with ID '%s', please report to Hamlib " "with ID '%s', please report to Hamlib "
"developers.\n", idbuf); "developers.\n", idbuf);

Wyświetl plik

@ -1,8 +1,8 @@
/* /*
* Hamlib Drake backend - main header * Hamlib Drake backend - main header
* Copyright (c) 2001,2002 by Stephane Fillod * Copyright (c) 2001-2003 by Stephane Fillod
* *
* $Id: drake.h,v 1.2 2002-10-20 20:46:32 fillods Exp $ * $Id: drake.h,v 1.3 2003-03-10 08:26:08 fillods Exp $
* *
* This library is free software; you can redistribute it and/or modify * This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as * it under the terms of the GNU Library General Public License as
@ -34,7 +34,7 @@ const char *drake_get_info(RIG *rig);
extern const struct rig_caps r8b_caps; extern const struct rig_caps r8b_caps;
extern BACKEND_EXPORT(int) initrigs_drake(void *be_handle); extern BACKEND_EXPORT(int) initrigs_drake(void *be_handle);
extern BACKEND_EXPORT(rig_model_t) probe_drake(port_t *port); extern BACKEND_EXPORT(rig_model_t) probeallrigs_drake(port_t *port, rig_probe_func_t cfunc, rig_ptr_t data);
#endif /* _DRAKE_H */ #endif /* _DRAKE_H */

Wyświetl plik

@ -1,8 +1,8 @@
/* /*
* Hamlib CI-V backend - main file * Hamlib CI-V backend - main file
* Copyright (c) 2000-2002 by Stephane Fillod * Copyright (c) 2000-2003 by Stephane Fillod
* *
* $Id: icom.c,v 1.71 2003-02-19 23:56:56 fillods Exp $ * $Id: icom.c,v 1.72 2003-03-10 08:26:08 fillods Exp $
* *
* This library is free software; you can redistribute it and/or modify * This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as * it under the terms of the GNU Library General Public License as
@ -2387,32 +2387,51 @@ int icom_decode_event(RIG *rig)
/* /*
* init_icom is called by rig_probe_all (register.c) * init_icom is called by rig_probe_all (register.c)
* *
* TODO: probe_icom will only report the _first_ device on the CI-V bus. * probe_icom reports all the devices on the CI-V bus.
* more devices could be found on the bus. * TODO: try different speeds
*/ */
rig_model_t probe_icom(port_t *p) rig_model_t probeallrigs_icom(port_t *p, rig_probe_func_t cfunc, rig_ptr_t data)
{ {
unsigned char buf[MAXFRAMELEN], civ_addr, civ_id; unsigned char buf[MAXFRAMELEN], civ_addr, civ_id;
int frm_len, i; int frm_len, i;
int retval; int retval;
rig_model_t model = RIG_MODEL_NONE;
int rates[] = { 19200, 9600, 300, 0 };
int rates_idx;
if (!p) if (!p)
return RIG_MODEL_NONE; return RIG_MODEL_NONE;
p->write_delay = p->post_write_delay = 0; if (p->type.rig != RIG_PORT_SERIAL)
p->timeout = 50; return RIG_MODEL_NONE;
p->retry = 1;
p->write_delay = p->post_write_delay = 0;
p->retry = 1;
/*
* try for all different baud rates
*/
for (rates_idx = 0; rates[rates_idx]; rates_idx++) {
p->parm.serial.rate = rates[rates_idx];
p->timeout = 2*1000/rates[rates_idx] + 40;
retval = serial_open(p); retval = serial_open(p);
if (retval != RIG_OK) if (retval != RIG_OK)
return RIG_MODEL_NONE; return RIG_MODEL_NONE;
/* try all possible addresses on the CI-V bus */ /*
* try all possible addresses on the CI-V bus
* FIXME: actualy, old rigs do not support C_RD_TRXID cmd!
* Try to be smart, and deduce model depending
* on freq range, return address, and
* available commands.
*/
for (civ_addr=0x01; civ_addr<=0x7f; civ_addr++) { for (civ_addr=0x01; civ_addr<=0x7f; civ_addr++) {
frm_len = make_cmd_frame(buf, civ_addr, C_RD_TRXID, S_RD_TRXID, frm_len = make_cmd_frame(buf, civ_addr, C_RD_TRXID, S_RD_TRXID,
NULL, 0); NULL, 0);
serial_flush(p);
write_block(p, buf, frm_len); write_block(p, buf, frm_len);
/* read out the bytes we just sent /* read out the bytes we just sent
@ -2445,24 +2464,34 @@ rig_model_t probe_icom(port_t *p)
for (i=0; icom_addr_list[i].model != RIG_MODEL_NONE; i++) { for (i=0; icom_addr_list[i].model != RIG_MODEL_NONE; i++) {
if (icom_addr_list[i].re_civ_addr == civ_id) { if (icom_addr_list[i].re_civ_addr == civ_id) {
close(p->fd);
rig_debug(RIG_DEBUG_VERBOSE,"probe_icom: found %#x" rig_debug(RIG_DEBUG_VERBOSE,"probe_icom: found %#x"
" at %#x\n", civ_id, buf[3]); " at %#x\n", civ_id, buf[3]);
return icom_addr_list[i].model; model = icom_addr_list[i].model;
if (cfunc)
(*cfunc)(p, model, data);
break;
} }
} }
/* /*
* not found in known table.... * not found in known table....
* update icom_addr_list[]! * update icom_addr_list[]!
*/ */
rig_debug(RIG_DEBUG_WARN,"probe_icom: found unknown device " if (icom_addr_list[i].model == RIG_MODEL_NONE)
rig_debug(RIG_DEBUG_WARN,"probe_icom: found unknown device "
"with CI-V ID %#x, please report to Hamlib " "with CI-V ID %#x, please report to Hamlib "
"developers.\n", civ_id); "developers.\n", civ_id);
} }
close(p->fd); close(p->fd);
return RIG_MODEL_NONE;
/*
* Assumes all the rigs on the bus are running at same speed.
* So if one at least has been found, none will be at lower speed.
*/
if (model != RIG_MODEL_NONE)
return model;
}
return model;
} }
/* /*

Wyświetl plik

@ -2,7 +2,7 @@
* Hamlib CI-V backend - main header * Hamlib CI-V backend - main header
* Copyright (c) 2000-2002 by Stephane Fillod * Copyright (c) 2000-2002 by Stephane Fillod
* *
* $Id: icom.h,v 1.52 2003-02-19 23:56:56 fillods Exp $ * $Id: icom.h,v 1.53 2003-03-10 08:26:08 fillods Exp $
* *
* This library is free software; you can redistribute it and/or modify * This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as * it under the terms of the GNU Library General Public License as
@ -168,7 +168,7 @@ extern const struct rig_caps os535_caps;
extern const struct rig_caps omnivip_caps; extern const struct rig_caps omnivip_caps;
extern BACKEND_EXPORT(rig_model_t) proberigs_icom(port_t *p); extern BACKEND_EXPORT(rig_model_t) probeallrigs_icom(port_t *p, rig_probe_func_t cfunc, rig_ptr_t data);
extern BACKEND_EXPORT(int) initrigs_icom(void *be_handle); extern BACKEND_EXPORT(int) initrigs_icom(void *be_handle);

Wyświetl plik

@ -1,8 +1,8 @@
/* /*
* Hamlib Kenwood backend - main file * Hamlib Kenwood backend - main file
* Copyright (c) 2000-2002 by Stephane Fillod * Copyright (c) 2000-2003 by Stephane Fillod and others
* *
* $Id: kenwood.c,v 1.57 2003-01-29 22:25:16 fillods Exp $ * $Id: kenwood.c,v 1.58 2003-03-10 08:26:09 fillods Exp $
* *
* This library is free software; you can redistribute it and/or modify * This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as * it under the terms of the GNU Library General Public License as
@ -1312,32 +1312,50 @@ const char* kenwood_get_info(RIG *rig)
#define IDBUFSZ 16 #define IDBUFSZ 16
/* /*
* probe_kenwood * proberigs_kenwood
*
* Notes:
* There's only one rig possible per port.
*/ */
rig_model_t probe_kenwood(port_t *port) rig_model_t probeallrigs_kenwood(port_t *port, rig_probe_func_t cfunc, rig_ptr_t data)
{ {
unsigned char idbuf[IDBUFSZ]; unsigned char idbuf[IDBUFSZ];
int id_len, i, k_id; int id_len, i, k_id;
int retval; int retval;
int rates[] = { 57600, 9600, 4800, 0 }; /* possible baud rates */
int rates_idx;
if (!port) if (!port)
return RIG_MODEL_NONE; return RIG_MODEL_NONE;
if (port->type.rig != RIG_PORT_SERIAL)
return RIG_MODEL_NONE;
port->write_delay = port->post_write_delay = 0; port->write_delay = port->post_write_delay = 0;
port->timeout = 50; port->parm.serial.stop_bits = 2;
port->retry = 1; port->retry = 1;
retval = serial_open(port); /*
if (retval != RIG_OK) * try for all different baud rates
*/
for (rates_idx = 0; rates[rates_idx]; rates_idx++) {
port->parm.serial.rate = rates[rates_idx];
port->timeout = 2*1000/rates[rates_idx] + 50;
retval = serial_open(port);
if (retval != RIG_OK)
return RIG_MODEL_NONE; return RIG_MODEL_NONE;
retval = write_block(port, "ID;", 3);
id_len = read_string(port, idbuf, IDBUFSZ, EOM_KEN EOM_TH, strlen(EOM_KEN EOM_TH));
close(port->fd);
retval = write_block(port, "ID;", 3); if (retval != RIG_OK || id_len < 0)
id_len = read_string(port, idbuf, IDBUFSZ, EOM_KEN EOM_TH, 2); continue;
}
close(port->fd); if (retval != RIG_OK || id_len < 0 || !strcmp(idbuf, "ID;"))
return RIG_MODEL_NONE;
if (retval != RIG_OK)
return RIG_MODEL_NONE;
/* /*
* reply should be something like 'IDxxx;' * reply should be something like 'IDxxx;'
@ -1356,6 +1374,8 @@ rig_model_t probe_kenwood(port_t *port)
if (!strncmp(kenwood_id_string_list[i].id, idbuf+2, 16)) { if (!strncmp(kenwood_id_string_list[i].id, idbuf+2, 16)) {
rig_debug(RIG_DEBUG_VERBOSE,"probe_kenwood: " rig_debug(RIG_DEBUG_VERBOSE,"probe_kenwood: "
"found %s\n", idbuf+2); "found %s\n", idbuf+2);
if (cfunc)
(*cfunc)(port, kenwood_id_string_list[i].model, data);
return kenwood_id_string_list[i].model; return kenwood_id_string_list[i].model;
} }
} }
@ -1381,6 +1401,8 @@ rig_model_t probe_kenwood(port_t *port)
*/ */
if (id_len == 4 || !strcmp(idbuf, "K2")) { if (id_len == 4 || !strcmp(idbuf, "K2")) {
rig_debug(RIG_DEBUG_VERBOSE,"probe_kenwood: found K2\n"); rig_debug(RIG_DEBUG_VERBOSE,"probe_kenwood: found K2\n");
if (cfunc)
(*cfunc)(port, RIG_MODEL_K2, data);
return RIG_MODEL_K2; return RIG_MODEL_K2;
} }
} }
@ -1389,6 +1411,8 @@ rig_model_t probe_kenwood(port_t *port)
if (kenwood_id_list[i].id == k_id) { if (kenwood_id_list[i].id == k_id) {
rig_debug(RIG_DEBUG_VERBOSE,"probe_kenwood: " rig_debug(RIG_DEBUG_VERBOSE,"probe_kenwood: "
"found %03d\n", k_id); "found %03d\n", k_id);
if (cfunc)
(*cfunc)(port, kenwood_id_list[i].model, data);
return kenwood_id_list[i].model; return kenwood_id_list[i].model;
} }
} }

Wyświetl plik

@ -2,7 +2,7 @@
* Hamlib Kenwood backend - main header * Hamlib Kenwood backend - main header
* Copyright (c) 2000-2002 by Stephane Fillod * Copyright (c) 2000-2002 by Stephane Fillod
* *
* $Id: kenwood.h,v 1.26 2002-11-13 20:35:18 fillods Exp $ * $Id: kenwood.h,v 1.27 2003-03-10 08:26:09 fillods Exp $
* *
* This library is free software; you can redistribute it and/or modify * This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as * it under the terms of the GNU Library General Public License as
@ -96,7 +96,7 @@ extern const struct rig_caps thf7e_caps;
extern const struct rig_caps k2_caps; extern const struct rig_caps k2_caps;
extern BACKEND_EXPORT(int) initrigs_kenwood(void *be_handle); extern BACKEND_EXPORT(int) initrigs_kenwood(void *be_handle);
extern BACKEND_EXPORT(rig_model_t) proberigs_kenwood(port_t *port); extern BACKEND_EXPORT(rig_model_t) probeallrigs_kenwood(port_t *port, rig_probe_func_t cfunc, rig_ptr_t data);
#endif /* _KENWOOD_H */ #endif /* _KENWOOD_H */

Wyświetl plik

@ -1,8 +1,8 @@
/* /*
* Hamlib Interface - provides registering for dynamically loadable backends. * Hamlib Interface - provides registering for dynamically loadable backends.
* Copyright (c) 2000,2001,2002 by Stephane Fillod * Copyright (c) 2000-2003 by Stephane Fillod
* *
* $Id: register.c,v 1.17 2002-11-04 22:27:49 fillods Exp $ * $Id: register.c,v 1.18 2003-03-10 08:26:09 fillods Exp $
* *
* This library is free software; you can redistribute it and/or modify * This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as * it under the terms of the GNU Library General Public License as
@ -53,7 +53,7 @@
static struct { static struct {
int be_num; int be_num;
const char *be_name; const char *be_name;
rig_model_t (*be_probe)(port_t *); rig_model_t (* be_probe_all)(port_t*, rig_probe_func_t, rig_ptr_t);
} rig_backend_list[RIG_BACKEND_MAX] = RIG_BACKEND_LIST; } rig_backend_list[RIG_BACKEND_MAX] = RIG_BACKEND_LIST;
@ -221,25 +221,48 @@ int rig_list_foreach(int (*cfunc)(const struct rig_caps*, rig_ptr_t),rig_ptr_t d
return RIG_OK; return RIG_OK;
} }
static int dummy_rig_probe(port_t *p, rig_model_t model, rig_ptr_t data)
{
rig_debug(RIG_DEBUG_TRACE, "Found rig, model %d\n", model);
return RIG_OK;
}
/* /*
* rig_probe_all * rig_probe_first
* called straight by rig_probe * called straight by rig_probe
*/ */
rig_model_t rig_probe_all(port_t *p) rig_model_t rig_probe_first(port_t *p)
{ {
int i; int i;
rig_model_t rig_model; rig_model_t model;
for (i=0; i<RIG_BACKEND_MAX && rig_backend_list[i].be_name; i++) { for (i=0; i<RIG_BACKEND_MAX && rig_backend_list[i].be_name; i++) {
if (rig_backend_list[i].be_probe) { if (rig_backend_list[i].be_probe_all) {
rig_model = (*rig_backend_list[i].be_probe)(p); model = (*rig_backend_list[i].be_probe_all)(p, dummy_rig_probe, NULL);
if (rig_model != RIG_MODEL_NONE) /* stop at first one found */
return rig_model; if (model != RIG_MODEL_NONE)
} return model;
}
} }
return RIG_MODEL_NONE; return RIG_MODEL_NONE;
} }
/*
* rig_probe_all_backends
* called straight by rig_probe_all
*/
int rig_probe_all_backends(port_t *p, rig_probe_func_t cfunc, rig_ptr_t data)
{
int i;
for (i=0; i<RIG_BACKEND_MAX && rig_backend_list[i].be_name; i++) {
if (rig_backend_list[i].be_probe_all) {
(*rig_backend_list[i].be_probe_all)(p, cfunc, data);
}
}
return RIG_OK;
}
int rig_load_all_backends() int rig_load_all_backends()
{ {
@ -275,7 +298,7 @@ int rig_load_backend(const char *be_name)
int status; int status;
char libname[PATH_MAX]; char libname[PATH_MAX];
char initfname[MAXFUNCNAMELEN] = "initrigs_"; char initfname[MAXFUNCNAMELEN] = "initrigs_";
char probefname[MAXFUNCNAMELEN] = "proberigs_"; char probefname[MAXFUNCNAMELEN] = "probeallrigs_";
int i; int i;
/* /*
@ -340,7 +363,7 @@ int rig_load_backend(const char *be_name)
for (i=0; i<RIG_BACKEND_MAX && rig_backend_list[i].be_name; i++) { for (i=0; i<RIG_BACKEND_MAX && rig_backend_list[i].be_name; i++) {
if (!strncmp(be_name, rig_backend_list[i].be_name, 64)) { if (!strncmp(be_name, rig_backend_list[i].be_name, 64)) {
strncat(probefname, be_name, MAXFUNCNAMELEN); strncat(probefname, be_name, MAXFUNCNAMELEN);
rig_backend_list[i].be_probe = (rig_model_t (*)(port_t *)) rig_backend_list[i].be_probe_all = (rig_probe_func_t)
lt_dlsym (be_handle, probefname); lt_dlsym (be_handle, probefname);
break; break;
} }

Wyświetl plik

@ -2,7 +2,7 @@
* Hamlib Interface - main file * Hamlib Interface - main file
* Copyright (c) 2000-2003 by Stephane Fillod and Frank Singleton * Copyright (c) 2000-2003 by Stephane Fillod and Frank Singleton
* *
* $Id: rig.c,v 1.67 2003-02-23 22:38:54 fillods Exp $ * $Id: rig.c,v 1.68 2003-03-10 08:26:09 fillods Exp $
* *
* This library is free software; you can redistribute it and/or modify * This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as * it under the terms of the GNU Library General Public License as
@ -2227,7 +2227,7 @@ int rig_reset(RIG *rig, reset_t reset)
* \brief try to guess a rig * \brief try to guess a rig
* \param port A pointer describing a port linking the host to the rig * \param port A pointer describing a port linking the host to the rig
* *
* Try to guess what is the model of rig pointed to by port. * Try to guess what is the model of the first rig attached to the port.
* It can be very buggy, and mess up the radio at the other end. * It can be very buggy, and mess up the radio at the other end.
* (but fun if it works!) * (but fun if it works!)
* *
@ -2239,10 +2239,35 @@ int rig_reset(RIG *rig, reset_t reset)
*/ */
rig_model_t rig_probe(port_t *port) rig_model_t rig_probe(port_t *port)
{ {
if (!port) if (!port)
return RIG_MODEL_NONE; return RIG_MODEL_NONE;
return rig_probe_all(port); return rig_probe_first(port);
}
/**
* \brief try to guess rigs
* \param port A pointer describing a port linking the host to the rigs
* \param cfunc Function to be called each time a rig is found
* \param data Arbitrary data passed to cfunc
*
* Try to guess what are the model of all rigs attached to the port.
* It can be very buggy, and mess up the radio at the other end.
* (but fun if it works!)
*
* \warning this is really Experimental, It has been tested only
* with IC-706MkIIG. any feedback welcome! --SF
*
* \return RIG_OK if the operation has been sucessful, otherwise
* a negative value if an error occured (in which case, cause is
* set appropriately).
*/
int rig_probe_all(port_t *port, rig_probe_func_t cfunc, rig_ptr_t data)
{
if (!port)
return -RIG_EINVAL;
return rig_probe_all_backends(port, cfunc, data);
} }
/** /**