kopia lustrzana https://github.com/Hamlib/Hamlib
Add Gemini DX-1200 HF-1K amplifier
rodzic
7b49921468
commit
363219e60a
1
NEWS
1
NEWS
|
@ -16,6 +16,7 @@ Version 4.6
|
||||||
|
|
||||||
Version 4.5
|
Version 4.5
|
||||||
* 2022-05-XX
|
* 2022-05-XX
|
||||||
|
* Add Gemini DX-1200 HF-1K Amplifiers
|
||||||
* Kenwood rigs should now support AI command packets
|
* Kenwood rigs should now support AI command packets
|
||||||
* Add FT-990UNI for older 990 ROMs 1.2 and earlier
|
* Add FT-990UNI for older 990 ROMs 1.2 and earlier
|
||||||
* Add FT-650
|
* Add FT-650
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
LOCAL_PATH:= $(call my-dir)
|
||||||
|
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
|
LOCAL_SRC_FILES := gemini
|
||||||
|
LOCAL_MODULE := gemini
|
||||||
|
|
||||||
|
LOCAL_CFLAGS :=
|
||||||
|
LOCAL_C_INCLUDES := android include src
|
||||||
|
LOCAL_LDLIBS := -lhamlib
|
||||||
|
|
||||||
|
include $(BUILD_STATIC_LIBRARY)
|
|
@ -0,0 +1,8 @@
|
||||||
|
SRC = gemini.c
|
||||||
|
|
||||||
|
GEMINISRC = dx1200.c gemini.h
|
||||||
|
|
||||||
|
noinst_LTLIBRARIES = libhamlib-gemini.la
|
||||||
|
libhamlib_gemini_la_SOURCES = $(SRC) $(GEMINISRC)
|
||||||
|
|
||||||
|
EXTRA_DIST = README.gemini Android.mk
|
|
@ -0,0 +1,4 @@
|
||||||
|
Back end for Gemini DX1200 and HF-1K
|
||||||
|
https://github.com/Hamlib/Hamlib/files/9063647/NetworkConnectionProtocol_3.pdf
|
||||||
|
|
||||||
|
Initial prototype 20220710
|
|
@ -0,0 +1,143 @@
|
||||||
|
/*
|
||||||
|
* Hamlib backend library for the Gemini DX1200 and HF-1K command set.
|
||||||
|
*
|
||||||
|
* dx1200.c - (C) Michael Black W9MDB 2022
|
||||||
|
*
|
||||||
|
* This shared library provides an API for communicating
|
||||||
|
* to Gemini amplifiers.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <hamlib/config.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h> /* Standard library definitions */
|
||||||
|
#include <string.h> /* String function definitions */
|
||||||
|
|
||||||
|
#include "register.h"
|
||||||
|
|
||||||
|
#include "gemini.h"
|
||||||
|
|
||||||
|
|
||||||
|
struct gemini_priv_data *gemini_priv;
|
||||||
|
/*
|
||||||
|
* API local implementation
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Private helper function prototypes
|
||||||
|
*/
|
||||||
|
|
||||||
|
//static int gemini_send_priv_cmd(AMP *amp, const char *cmd);
|
||||||
|
//static int gemini_flush_buffer(AMP *amp);
|
||||||
|
|
||||||
|
/* *************************************
|
||||||
|
*
|
||||||
|
* Separate model capabilities
|
||||||
|
*
|
||||||
|
* *************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Gemini
|
||||||
|
*/
|
||||||
|
|
||||||
|
const struct amp_caps gemini_amp_caps =
|
||||||
|
{
|
||||||
|
AMP_MODEL(AMP_MODEL_GEMINI_DX1200),
|
||||||
|
.model_name = "DX1200/HF-1K",
|
||||||
|
.mfg_name = "Gemini",
|
||||||
|
.version = "20220710.0",
|
||||||
|
.copyright = "LGPL",
|
||||||
|
.status = RIG_STATUS_ALPHA,
|
||||||
|
.amp_type = AMP_TYPE_OTHER,
|
||||||
|
.port_type = RIG_PORT_NETWORK,
|
||||||
|
.write_delay = 0,
|
||||||
|
.post_write_delay = 0,
|
||||||
|
.timeout = 2000,
|
||||||
|
.retry = 2,
|
||||||
|
.has_get_level = AMP_LEVEL_SWR | AMP_LEVEL_PWR_FWD | AMP_LEVEL_PWR_PEAK | AMP_LEVEL_FAULT | AMP_LEVEL_PWR,
|
||||||
|
.has_set_level = AMP_LEVEL_PWR,
|
||||||
|
|
||||||
|
.amp_open = NULL,
|
||||||
|
.amp_init = gemini_init,
|
||||||
|
.amp_close = gemini_close,
|
||||||
|
.reset = gemini_reset,
|
||||||
|
.get_info = gemini_get_info,
|
||||||
|
.get_powerstat = gemini_get_powerstat,
|
||||||
|
.set_powerstat = gemini_set_powerstat,
|
||||||
|
.get_freq = gemini_get_freq,
|
||||||
|
.set_freq = gemini_set_freq,
|
||||||
|
.get_level = gemini_get_level,
|
||||||
|
.set_level = gemini_set_level,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* ************************************
|
||||||
|
*
|
||||||
|
* API functions
|
||||||
|
*
|
||||||
|
* ************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if 0 // not implemented yet
|
||||||
|
/*
|
||||||
|
* Send command string to amplifier
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int gemini_send_priv_cmd(AMP *amp, const char *cmdstr)
|
||||||
|
{
|
||||||
|
struct amp_state *rs;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
|
||||||
|
|
||||||
|
if (!amp)
|
||||||
|
{
|
||||||
|
return -RIG_EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
rs = &->state;
|
||||||
|
err = write_block(&rs->ampport, cmdstr, strlen(cmdstr));
|
||||||
|
|
||||||
|
if (err != RIG_OK)
|
||||||
|
{
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
return RIG_OK;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initialize backend
|
||||||
|
*/
|
||||||
|
|
||||||
|
DECLARE_INITAMP_BACKEND(gemini)
|
||||||
|
{
|
||||||
|
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
|
||||||
|
|
||||||
|
amp_register(&gemini_amp_caps);
|
||||||
|
|
||||||
|
return RIG_OK;
|
||||||
|
}
|
|
@ -0,0 +1,397 @@
|
||||||
|
/*
|
||||||
|
* Hamlib Gemini amplifier backend - low level communication routines
|
||||||
|
* Copyright (c) 2019 by Michael Black W9MDB
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "misc.h"
|
||||||
|
#include "gemini.h"
|
||||||
|
|
||||||
|
struct fault_list
|
||||||
|
{
|
||||||
|
int code;
|
||||||
|
char *errmsg;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initialize data structures
|
||||||
|
*/
|
||||||
|
|
||||||
|
int gemini_init(AMP *amp)
|
||||||
|
{
|
||||||
|
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
|
||||||
|
|
||||||
|
if (!amp)
|
||||||
|
{
|
||||||
|
return -RIG_EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
amp->state.priv = (struct gemini_priv_data *)
|
||||||
|
malloc(sizeof(struct gemini_priv_data));
|
||||||
|
|
||||||
|
if (!amp->state.priv)
|
||||||
|
{
|
||||||
|
return -RIG_ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
amp->state.ampport.type.rig = RIG_PORT_NETWORK;
|
||||||
|
|
||||||
|
return RIG_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int gemini_close(AMP *amp)
|
||||||
|
{
|
||||||
|
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
|
||||||
|
|
||||||
|
if (amp->state.priv) { free(amp->state.priv); }
|
||||||
|
|
||||||
|
amp->state.priv = NULL;
|
||||||
|
|
||||||
|
return RIG_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int gemini_flushbuffer(AMP *amp)
|
||||||
|
{
|
||||||
|
struct amp_state *rs;
|
||||||
|
|
||||||
|
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
|
||||||
|
|
||||||
|
rs = &->state;
|
||||||
|
|
||||||
|
return rig_flush(&rs->ampport);
|
||||||
|
}
|
||||||
|
|
||||||
|
int gemini_transaction(AMP *amp, const char *cmd, char *response,
|
||||||
|
int response_len)
|
||||||
|
{
|
||||||
|
|
||||||
|
struct amp_state *rs;
|
||||||
|
int err;
|
||||||
|
int len = 0;
|
||||||
|
|
||||||
|
rig_debug(RIG_DEBUG_VERBOSE, "%s called, cmd=%s\n", __func__, cmd);
|
||||||
|
|
||||||
|
if (!amp) { return -RIG_EINVAL; }
|
||||||
|
|
||||||
|
gemini_flushbuffer(amp);
|
||||||
|
|
||||||
|
rs = &->state;
|
||||||
|
|
||||||
|
// Now send our command
|
||||||
|
err = write_block(&rs->ampport, (unsigned char *) cmd, strlen(cmd));
|
||||||
|
|
||||||
|
if (err != RIG_OK) { return err; }
|
||||||
|
|
||||||
|
if (response) // if response expected get it
|
||||||
|
{
|
||||||
|
response[0] = 0;
|
||||||
|
len = read_string(&rs->ampport, (unsigned char *) response, response_len, "\n",
|
||||||
|
1, 0, 1);
|
||||||
|
|
||||||
|
if (len < 0)
|
||||||
|
{
|
||||||
|
rig_debug(RIG_DEBUG_VERBOSE, "%s called, error=%s\n", __func__,
|
||||||
|
rigerror(len));
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
rig_debug(RIG_DEBUG_VERBOSE, "%s called, response='%s'\n", __func__,
|
||||||
|
response);
|
||||||
|
}
|
||||||
|
|
||||||
|
return RIG_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get Info
|
||||||
|
* returns the model name string
|
||||||
|
*/
|
||||||
|
const char *gemini_get_info(AMP *amp)
|
||||||
|
{
|
||||||
|
const struct amp_caps *rc;
|
||||||
|
|
||||||
|
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
|
||||||
|
|
||||||
|
if (!amp) { return (const char *) - RIG_EINVAL; }
|
||||||
|
|
||||||
|
rc = amp->caps;
|
||||||
|
|
||||||
|
return rc->model_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
int gemini_status_parse(AMP *amp)
|
||||||
|
{
|
||||||
|
int retval, n;
|
||||||
|
char *p;
|
||||||
|
char responsebuf[GEMINIBUFSZ];
|
||||||
|
struct gemini_priv_data *priv = amp->state.priv;
|
||||||
|
|
||||||
|
retval = gemini_transaction(amp, "S\n", responsebuf, sizeof(responsebuf));
|
||||||
|
|
||||||
|
if (retval != RIG_OK)
|
||||||
|
{
|
||||||
|
rig_debug(RIG_DEBUG_ERR, "%s: error sending command 'S'\n", __func__);
|
||||||
|
}
|
||||||
|
|
||||||
|
p = strtok(responsebuf, ",\n");
|
||||||
|
rig_debug(RIG_DEBUG_VERBOSE, "%s: responsebuf=%s\n", __func__, responsebuf);
|
||||||
|
|
||||||
|
while (p)
|
||||||
|
{
|
||||||
|
char tmp[8];
|
||||||
|
double freq;
|
||||||
|
n = 0;
|
||||||
|
n += sscanf(p, "BAND=%lf%s", &freq, tmp);
|
||||||
|
|
||||||
|
if (tmp[0] == 'K') { priv->band = freq * 1000; }
|
||||||
|
|
||||||
|
if (tmp[0] == 'M') { priv->band = freq * 1000000; }
|
||||||
|
|
||||||
|
n += sscanf(p, "ANTENNA=%c", &priv->antenna);
|
||||||
|
n += sscanf(p, "POWER=%dW%d", &priv->power_current, &priv->power_peak);
|
||||||
|
n += sscanf(p, "VSWR=%lf", &priv->vswr);
|
||||||
|
n += sscanf(p, "CURRENT=%d", &priv->current);
|
||||||
|
n += sscanf(p, "TEMPERATURE=%d", &priv->temperature);
|
||||||
|
n += sscanf(p, "STATE=%s", priv->state);
|
||||||
|
n += sscanf(p, "PTT=%s", tmp);
|
||||||
|
priv->ptt = tmp[0] == 'T';
|
||||||
|
n += sscanf(p, "TRIP=%s", priv->trip);
|
||||||
|
|
||||||
|
if (n == 0)
|
||||||
|
{
|
||||||
|
rig_debug(RIG_DEBUG_ERR, "%s: unknown status item=%s\n", __func__, p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n == 0) { return -RIG_EPROTO; }
|
||||||
|
|
||||||
|
return RIG_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int gemini_get_freq(AMP *amp, freq_t *freq)
|
||||||
|
{
|
||||||
|
int retval;
|
||||||
|
struct gemini_priv_data *priv = amp->state.priv;
|
||||||
|
|
||||||
|
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
|
||||||
|
|
||||||
|
if (!amp) { return -RIG_EINVAL; }
|
||||||
|
|
||||||
|
retval = gemini_status_parse(amp);
|
||||||
|
|
||||||
|
if (retval != RIG_OK) { return retval; }
|
||||||
|
|
||||||
|
*freq = priv->band;
|
||||||
|
return RIG_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int gemini_set_freq(AMP *amp, freq_t freq)
|
||||||
|
{
|
||||||
|
int retval;
|
||||||
|
char *cmd;
|
||||||
|
|
||||||
|
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
|
||||||
|
if (freq < 1.0) cmd = "B472KHZ\n";
|
||||||
|
else if (freq < 2.0) cmd = "B1.8MHZ\n";
|
||||||
|
else if (freq < 4.0) cmd = "B3.5MHZ\n";
|
||||||
|
else if (freq < 6.0) cmd = "B50MHZ\n";
|
||||||
|
else if (freq < 9.0) cmd = "B70MHZ\n";
|
||||||
|
else if (freq < 12.0) cmd = "B10MHZ\n";
|
||||||
|
else if (freq < 16.0) cmd = "B14MHZ\n";
|
||||||
|
else if (freq < 19.0) cmd = "B18MHZ\n";
|
||||||
|
else if (freq < 22.0) cmd = "B21MHZ\n";
|
||||||
|
else if (freq < 26.0) cmd = "B24MHZ\n";
|
||||||
|
else cmd = "B50MHZ\n";
|
||||||
|
retval = gemini_transaction(amp, cmd, NULL, 0);
|
||||||
|
|
||||||
|
if (retval != RIG_OK) { return retval; }
|
||||||
|
return RIG_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int gemini_get_level(AMP *amp, setting_t level, value_t *val)
|
||||||
|
{
|
||||||
|
int retval;
|
||||||
|
struct gemini_priv_data *priv = amp->state.priv;
|
||||||
|
|
||||||
|
|
||||||
|
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
|
||||||
|
|
||||||
|
retval = gemini_status_parse(amp);
|
||||||
|
|
||||||
|
if (retval != RIG_OK) { return retval; }
|
||||||
|
|
||||||
|
switch (level)
|
||||||
|
{
|
||||||
|
case AMP_LEVEL_SWR:
|
||||||
|
val->f = priv->vswr;
|
||||||
|
return RIG_OK;
|
||||||
|
|
||||||
|
case AMP_LEVEL_PWR_FWD:
|
||||||
|
val->i = priv->power_peak;
|
||||||
|
return RIG_OK;
|
||||||
|
|
||||||
|
case AMP_LEVEL_PWR_PEAK:
|
||||||
|
val->i = priv->power_peak;
|
||||||
|
return RIG_OK;
|
||||||
|
|
||||||
|
case AMP_LEVEL_FAULT:
|
||||||
|
val->s = priv->trip;
|
||||||
|
return RIG_OK;
|
||||||
|
|
||||||
|
default:
|
||||||
|
rig_debug(RIG_DEBUG_ERR, "%s unknown level=%s\n", __func__,
|
||||||
|
rig_strlevel(level));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return -RIG_EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int gemini_set_level(AMP *amp, setting_t level, value_t val)
|
||||||
|
{
|
||||||
|
char *cmd = "?";
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
|
||||||
|
|
||||||
|
switch (level)
|
||||||
|
{
|
||||||
|
case AMP_LEVEL_PWR: // 0-.33 = low, .34-.67 = medium, .68-1.0 = high
|
||||||
|
cmd = "PH\n";
|
||||||
|
|
||||||
|
if (val.f < .33) { cmd = "PL\n"; }
|
||||||
|
|
||||||
|
if (val.f < .67) { cmd = "PM\n"; }
|
||||||
|
|
||||||
|
return RIG_OK;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
retval = gemini_transaction(amp, cmd, NULL, 0);
|
||||||
|
|
||||||
|
if (retval != RIG_OK) { return retval; }
|
||||||
|
|
||||||
|
rig_debug(RIG_DEBUG_ERR, "%s: Unknown level=%s\n", __func__,
|
||||||
|
rig_strlevel(level));
|
||||||
|
return -RIG_EINVAL;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int gemini_get_powerstat(AMP *amp, powerstat_t *status)
|
||||||
|
{
|
||||||
|
char responsebuf[GEMINIBUFSZ];
|
||||||
|
int retval;
|
||||||
|
int ampon;
|
||||||
|
int nargs;
|
||||||
|
|
||||||
|
|
||||||
|
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
|
||||||
|
|
||||||
|
*status = RIG_POWER_UNKNOWN;
|
||||||
|
|
||||||
|
if (!amp) { return -RIG_EINVAL; }
|
||||||
|
|
||||||
|
retval = gemini_transaction(amp, "R\n", responsebuf, sizeof(responsebuf));
|
||||||
|
|
||||||
|
if (retval != RIG_OK) { return retval; }
|
||||||
|
|
||||||
|
nargs = sscanf(responsebuf, "%d", &on);
|
||||||
|
|
||||||
|
if (nargs != 1)
|
||||||
|
{
|
||||||
|
rig_debug(RIG_DEBUG_VERBOSE, "%s Error: ^ON response='%s'\n", __func__,
|
||||||
|
responsebuf);
|
||||||
|
return -RIG_EPROTO;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (ampon)
|
||||||
|
{
|
||||||
|
case 0: *status = RIG_POWER_STANDBY; return RIG_OK;
|
||||||
|
|
||||||
|
case 1: *status = RIG_POWER_ON; break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
rig_debug(RIG_DEBUG_VERBOSE, "%s Error: 'R' unknown response='%s'\n", __func__,
|
||||||
|
responsebuf);
|
||||||
|
return -RIG_EPROTO;
|
||||||
|
}
|
||||||
|
|
||||||
|
return RIG_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int gemini_set_powerstat(AMP *amp, powerstat_t status)
|
||||||
|
{
|
||||||
|
int retval;
|
||||||
|
char *cmd = NULL;
|
||||||
|
|
||||||
|
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
|
||||||
|
|
||||||
|
if (!amp) { return -RIG_EINVAL; }
|
||||||
|
|
||||||
|
switch (status)
|
||||||
|
{
|
||||||
|
case RIG_POWER_UNKNOWN: break;
|
||||||
|
|
||||||
|
case RIG_POWER_OFF: cmd = "R0\n"; break;
|
||||||
|
|
||||||
|
case RIG_POWER_ON: cmd = "LP1\n"; break;
|
||||||
|
|
||||||
|
case RIG_POWER_OPERATE: cmd = "R1\n"; break;
|
||||||
|
|
||||||
|
case RIG_POWER_STANDBY: cmd = "R0\n"; break;
|
||||||
|
|
||||||
|
|
||||||
|
default:
|
||||||
|
rig_debug(RIG_DEBUG_ERR, "%s invalid status=%d\n", __func__, status);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
retval = gemini_transaction(amp, cmd, NULL, 0);
|
||||||
|
|
||||||
|
if (retval != RIG_OK) { return retval; }
|
||||||
|
|
||||||
|
return RIG_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int gemini_reset(AMP *amp, amp_reset_t reset)
|
||||||
|
{
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
|
||||||
|
|
||||||
|
retval = gemini_transaction(amp, "T\n", NULL, 0);
|
||||||
|
|
||||||
|
if (retval != RIG_OK)
|
||||||
|
{
|
||||||
|
rig_debug(RIG_DEBUG_ERR, "%s: error setting RIG_POWER_STANDBY '%s'\n", __func__,
|
||||||
|
strerror(retval));
|
||||||
|
}
|
||||||
|
|
||||||
|
// toggling from standby to operate perhaps does a reset
|
||||||
|
retval = gemini_set_powerstat(amp, RIG_POWER_STANDBY);
|
||||||
|
|
||||||
|
if (retval != RIG_OK)
|
||||||
|
{
|
||||||
|
rig_debug(RIG_DEBUG_ERR, "%s: error setting RIG_POWER_STANDBY '%s'\n", __func__,
|
||||||
|
strerror(retval));
|
||||||
|
}
|
||||||
|
|
||||||
|
return gemini_set_powerstat(amp, RIG_POWER_OPERATE);
|
||||||
|
}
|
|
@ -0,0 +1,72 @@
|
||||||
|
/*
|
||||||
|
* Hamlib backend library for the Gemini amplifier set.
|
||||||
|
*
|
||||||
|
* gemini.h - (C) Michael Black W9MDB 2022
|
||||||
|
*
|
||||||
|
* This shared library provides an API for communicating
|
||||||
|
* via serial interface to Gemini amplifiers.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _AMP_GEMINI_H
|
||||||
|
#define _AMP_GEMINI_H 1
|
||||||
|
|
||||||
|
#include <hamlib/amplifier.h>
|
||||||
|
#include <iofunc.h>
|
||||||
|
#include <serial.h>
|
||||||
|
|
||||||
|
// Is this big enough?
|
||||||
|
#define GEMINIBUFSZ 1024
|
||||||
|
|
||||||
|
extern const struct amp_caps gemini_amp_caps;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Private data structure
|
||||||
|
*/
|
||||||
|
struct gemini_priv_data
|
||||||
|
{
|
||||||
|
long band; // Hz
|
||||||
|
char antenna;
|
||||||
|
int power_current; // Watts
|
||||||
|
int power_peak; // Watts
|
||||||
|
double vswr;
|
||||||
|
int current; // Amps
|
||||||
|
int temperature; // Centigrade
|
||||||
|
char state[5];
|
||||||
|
int ptt;
|
||||||
|
char trip[256];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
int gemini_init(AMP *amp);
|
||||||
|
int gemini_close(AMP *amp);
|
||||||
|
int gemini_reset(AMP *amp, amp_reset_t reset);
|
||||||
|
int gemini_flush_buffer(AMP *amp);
|
||||||
|
int gemini_transaction(AMP *amp, const char *cmd, char *response,
|
||||||
|
int response_len);
|
||||||
|
const char *gemini_get_info(AMP *amp);
|
||||||
|
int gemini_get_freq(AMP *amp, freq_t *freq);
|
||||||
|
int gemini_set_freq(AMP *amp, freq_t freq);
|
||||||
|
|
||||||
|
int gemini_get_level(AMP *amp, setting_t level, value_t *val);
|
||||||
|
int gemini_set_level(AMP *amp, setting_t level, value_t val);
|
||||||
|
int gemini_get_powerstat(AMP *amp, powerstat_t *status);
|
||||||
|
int gemini_set_powerstat(AMP *amp, powerstat_t status);
|
||||||
|
|
||||||
|
#endif /* _AMP_GEMINI_H */
|
||||||
|
|
|
@ -50,7 +50,7 @@ dnl here but will be added later, e.g. "winradio".
|
||||||
RIG_BACKEND_LIST="rigs/adat rigs/alinco rigs/aor rigs/barrett rigs/codan rigs/dorji rigs/drake rigs/dummy rigs/elad rigs/flexradio rigs/icom rigs/icmarine rigs/jrc rigs/kachina rigs/kenwood rigs/kit rigs/lowe rigs/pcr rigs/prm80 rigs/racal rigs/rft rigs/rs rigs/skanti rigs/tapr rigs/tentec rigs/tuner rigs/uniden rigs/winradio rigs/wj rigs/yaesu rigs/gomspace"
|
RIG_BACKEND_LIST="rigs/adat rigs/alinco rigs/aor rigs/barrett rigs/codan rigs/dorji rigs/drake rigs/dummy rigs/elad rigs/flexradio rigs/icom rigs/icmarine rigs/jrc rigs/kachina rigs/kenwood rigs/kit rigs/lowe rigs/pcr rigs/prm80 rigs/racal rigs/rft rigs/rs rigs/skanti rigs/tapr rigs/tentec rigs/tuner rigs/uniden rigs/winradio rigs/wj rigs/yaesu rigs/gomspace"
|
||||||
ROT_BACKEND_LIST="rotators/amsat rotators/ars rotators/celestron rotators/cnctrk rotators/grbltrk rotators/easycomm rotators/ether6 rotators/fodtrack rotators/gs232a rotators/heathkit rotators/m2 rotators/meade rotators/rotorez rotators/sartek rotators/spid rotators/ts7400 rotators/prosistel rotators/ioptron rotators/satel rotators/radant"
|
ROT_BACKEND_LIST="rotators/amsat rotators/ars rotators/celestron rotators/cnctrk rotators/grbltrk rotators/easycomm rotators/ether6 rotators/fodtrack rotators/gs232a rotators/heathkit rotators/m2 rotators/meade rotators/rotorez rotators/sartek rotators/spid rotators/ts7400 rotators/prosistel rotators/ioptron rotators/satel rotators/radant"
|
||||||
# Amplifiers are all in the amplifiers directory
|
# Amplifiers are all in the amplifiers directory
|
||||||
AMP_BACKEND_LIST="amplifiers/elecraft"
|
AMP_BACKEND_LIST="amplifiers/elecraft amplifiers/gemini"
|
||||||
|
|
||||||
dnl See README.release on setting these values
|
dnl See README.release on setting these values
|
||||||
# Values given to -version-info when linking. See libtool documentation.
|
# Values given to -version-info when linking. See libtool documentation.
|
||||||
|
@ -883,6 +883,7 @@ tests/Makefile
|
||||||
scripts/Makefile
|
scripts/Makefile
|
||||||
android/Makefile
|
android/Makefile
|
||||||
amplifiers/elecraft/Makefile
|
amplifiers/elecraft/Makefile
|
||||||
|
amplifiers/gemini/Makefile
|
||||||
simulators/Makefile
|
simulators/Makefile
|
||||||
hamlib.pc
|
hamlib.pc
|
||||||
])
|
])
|
||||||
|
|
|
@ -458,6 +458,24 @@ as in
|
||||||
.B set_powerstat
|
.B set_powerstat
|
||||||
above.
|
above.
|
||||||
.
|
.
|
||||||
|
.TP
|
||||||
|
.BR Y ", " set_ant " \(aq" \fIAntenna\fP "\(aq \(aq" \fIOption\fP \(aq
|
||||||
|
Set
|
||||||
|
.RI \(aq Antenna \(aq
|
||||||
|
and
|
||||||
|
.RI \(aq Option \(aq.
|
||||||
|
.IP
|
||||||
|
Number is 1-based antenna# (\(oq1\(cq, \(oq2\(cq, \(oq3\(cq, ...).
|
||||||
|
.IP
|
||||||
|
.in +4n
|
||||||
|
.EX
|
||||||
|
1 = A/1
|
||||||
|
2 = B/2
|
||||||
|
3 = C/3
|
||||||
|
.EE
|
||||||
|
.in
|
||||||
|
.
|
||||||
|
|
||||||
.
|
.
|
||||||
.SH READLINE
|
.SH READLINE
|
||||||
.
|
.
|
||||||
|
|
|
@ -146,7 +146,8 @@ enum amp_level_e
|
||||||
AMP_LEVEL_PWR_FWD = (1 << 4), /*!< \c Power reading forward. */
|
AMP_LEVEL_PWR_FWD = (1 << 4), /*!< \c Power reading forward. */
|
||||||
AMP_LEVEL_PWR_REFLECTED = (1 << 5), /*!< \c Power reading reverse. */
|
AMP_LEVEL_PWR_REFLECTED = (1 << 5), /*!< \c Power reading reverse. */
|
||||||
AMP_LEVEL_PWR_PEAK = (1 << 6), /*!< \c Power reading peak. */
|
AMP_LEVEL_PWR_PEAK = (1 << 6), /*!< \c Power reading peak. */
|
||||||
AMP_LEVEL_FAULT = (1 << 7) /*!< \c Fault code. */
|
AMP_LEVEL_FAULT = (1 << 7), /*!< \c Fault code. */
|
||||||
|
AMP_LEVEL_PWR = (1 << 8), /*!< \c Power setting. */
|
||||||
};
|
};
|
||||||
//! @endcond
|
//! @endcond
|
||||||
|
|
||||||
|
@ -242,6 +243,7 @@ struct amp_caps
|
||||||
|
|
||||||
int (*reset)(AMP *amp, amp_reset_t reset); /*!< Pointer to backend implementation of ::amp_reset(). */
|
int (*reset)(AMP *amp, amp_reset_t reset); /*!< Pointer to backend implementation of ::amp_reset(). */
|
||||||
int (*get_level)(AMP *amp, setting_t level, value_t *val); /*!< Pointer to backend implementation of ::amp_get_level(). */
|
int (*get_level)(AMP *amp, setting_t level, value_t *val); /*!< Pointer to backend implementation of ::amp_get_level(). */
|
||||||
|
int (*set_level)(AMP *amp, setting_t level, value_t val); /*!< Pointer to backend implementation of ::amp_get_level(). */
|
||||||
int (*get_ext_level)(AMP *amp, token_t level, value_t *val); /*!< Pointer to backend implementation of ::amp_get_ext_level(). */
|
int (*get_ext_level)(AMP *amp, token_t level, value_t *val); /*!< Pointer to backend implementation of ::amp_get_ext_level(). */
|
||||||
int (*set_powerstat)(AMP *amp, powerstat_t status); /*!< Pointer to backend implementation of ::amp_set_powerstat(). */
|
int (*set_powerstat)(AMP *amp, powerstat_t status); /*!< Pointer to backend implementation of ::amp_set_powerstat(). */
|
||||||
int (*get_powerstat)(AMP *amp, powerstat_t *status); /*!< Pointer to backend implementation of ::amp_get_powerstat(). */
|
int (*get_powerstat)(AMP *amp, powerstat_t *status); /*!< Pointer to backend implementation of ::amp_get_powerstat(). */
|
||||||
|
|
|
@ -106,6 +106,10 @@
|
||||||
//! @endcond
|
//! @endcond
|
||||||
#define AMP_MODEL_ELECRAFT_KPA1500 AMP_MAKE_MODEL(AMP_ELECRAFT, 1)
|
#define AMP_MODEL_ELECRAFT_KPA1500 AMP_MAKE_MODEL(AMP_ELECRAFT, 1)
|
||||||
//#define AMP_MODEL_ELECRAFT_KPA500 AMP_MAKE_MODEL(AMP_ELECRAFT, 2)
|
//#define AMP_MODEL_ELECRAFT_KPA500 AMP_MAKE_MODEL(AMP_ELECRAFT, 2)
|
||||||
|
#define AMP_GEMINI 3
|
||||||
|
#define AMP_BACKEND_GEMINI "gemini"
|
||||||
|
#define AMP_MODEL_GEMINI_DX1200 AMP_MAKE_MODEL(AMP_GEMINI, 1)
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Convenience type definition for an amplifier model.
|
* \brief Convenience type definition for an amplifier model.
|
||||||
|
|
|
@ -65,6 +65,7 @@
|
||||||
|
|
||||||
DEFINE_INITAMP_BACKEND(dummy);
|
DEFINE_INITAMP_BACKEND(dummy);
|
||||||
DEFINE_INITAMP_BACKEND(kpa1500);
|
DEFINE_INITAMP_BACKEND(kpa1500);
|
||||||
|
DEFINE_INITAMP_BACKEND(gemini);
|
||||||
//! @endcond
|
//! @endcond
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -87,6 +88,7 @@ static struct
|
||||||
{
|
{
|
||||||
{ AMP_DUMMY, AMP_BACKEND_DUMMY, AMP_FUNCNAMA(dummy) },
|
{ AMP_DUMMY, AMP_BACKEND_DUMMY, AMP_FUNCNAMA(dummy) },
|
||||||
{ AMP_ELECRAFT, AMP_BACKEND_ELECRAFT, AMP_FUNCNAMA(kpa1500) },
|
{ AMP_ELECRAFT, AMP_BACKEND_ELECRAFT, AMP_FUNCNAMA(kpa1500) },
|
||||||
|
{ AMP_GEMINI, AMP_BACKEND_GEMINI, AMP_FUNCNAMA(gemini) },
|
||||||
{ 0, NULL }, /* end */
|
{ 0, NULL }, /* end */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -97,7 +97,7 @@ int rig_set_cache_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
rig_debug(RIG_DEBUG_ERR, "%s: unknown vfo=%s\n", __func__, rig_strvfo(vfo));
|
rig_debug(RIG_DEBUG_WARN, "%s: unknown vfo=%s\n", __func__, rig_strvfo(vfo));
|
||||||
RETURNFUNC(-RIG_EINTERNAL);
|
RETURNFUNC(-RIG_EINTERNAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue