Updated the GPIO keyer to take a 5th (optional) argument, hangtime. Sets the number of milliseconds for a semi-QSK delay (i.e. stay in transmit for # of msecs after last CW symbol).
This commit is contained in:
parent
8a58f0dba8
commit
9a343877e5
37
gpiokeyer.c
37
gpiokeyer.c
|
@ -111,6 +111,7 @@ Boston, MA 02110-1301, USA.
|
||||||
**********************************************************************/
|
**********************************************************************/
|
||||||
|
|
||||||
#define NSEC_PER_SEC (1000000000)
|
#define NSEC_PER_SEC (1000000000)
|
||||||
|
#define CW_HANGTIME_DEFAULT (250)
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* Types
|
* Types
|
||||||
|
@ -184,7 +185,7 @@ static int cw_keyer_weight = 55;
|
||||||
static int cw_keys_reversed = 0;
|
static int cw_keys_reversed = 0;
|
||||||
static int cw_keyer_spacing = 0;
|
static int cw_keyer_spacing = 0;
|
||||||
static int cw_keyer_enabled = 1;
|
static int cw_keyer_enabled = 1;
|
||||||
static int cw_hangtime_msec = 250; // not currently (re-)configurable
|
static int cw_hangtime_msec = CW_HANGTIME_DEFAULT;
|
||||||
static int cw_active_state = 0; // not currently (re-)configurable
|
static int cw_active_state = 0; // not currently (re-)configurable
|
||||||
|
|
||||||
/* Current Paddle State
|
/* Current Paddle State
|
||||||
|
@ -238,7 +239,7 @@ static void keyer_update() {
|
||||||
* semi-QSK delay. ~250ms after the end of the last symbol, the
|
* semi-QSK delay. ~250ms after the end of the last symbol, the
|
||||||
* T/R switch will be disabled.
|
* T/R switch will be disabled.
|
||||||
*/
|
*/
|
||||||
cw_hangtime_msec = (int)(0.25f * 1000.0f);
|
// cw_hangtime_msec = (int)(0.25f * 1000.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* KC4UPR: The "actual" event handler. Updates the value of the
|
/* KC4UPR: The "actual" event handler. Updates the value of the
|
||||||
|
@ -609,7 +610,20 @@ int open_key_gpiokeyer(const char * name)
|
||||||
* two can be zero if that functionality is not desired, but they
|
* two can be zero if that functionality is not desired, but they
|
||||||
* must be present in the name string.
|
* must be present in the name string.
|
||||||
*/
|
*/
|
||||||
if (sscanf(name, "gpio:%d,%d,%d,%d", &left_paddle_gpio, &right_paddle_gpio, &keyer_out_gpio, &tr_switch_gpio) < 4) {
|
switch(sscanf(name, "gpio:%d,%d,%d,%d,%d", &left_paddle_gpio, &right_paddle_gpio, &keyer_out_gpio, &tr_switch_gpio, &cw_hangtime_msec)) {
|
||||||
|
case 5:
|
||||||
|
if (cw_hangtime_msec > 1000) cw_hangtime_msec = 1000;
|
||||||
|
if (cw_hangtime_msec < 0) cw_hangtime_msec = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
/* KC4UPR: matched the first 4 inputs - original v0.1 interface.
|
||||||
|
* Need to fill-in-blanks for later version(s).
|
||||||
|
*/
|
||||||
|
cw_hangtime_msec = CW_HANGTIME_DEFAULT;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
fprintf(stderr, "[GPIO Keyer] insufficient parameters: %s\n", name);
|
fprintf(stderr, "[GPIO Keyer] insufficient parameters: %s\n", name);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -783,7 +797,7 @@ void quisk_set_gpio_keyer_strict(int flag)
|
||||||
cw_keyer_spacing = (flag == 0 ? 0 : 1);
|
cw_keyer_spacing = (flag == 0 ? 0 : 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* KC4UPR: Enabled/disable the keyer. If true, then regardless of
|
/* KC4UPR: Enable/disable the keyer. If disabled, then regardless of
|
||||||
* state, nothing will be output.
|
* state, nothing will be output.
|
||||||
*/
|
*/
|
||||||
void quisk_set_gpio_keyer_enabled(int flag)
|
void quisk_set_gpio_keyer_enabled(int flag)
|
||||||
|
@ -795,6 +809,21 @@ void quisk_set_gpio_keyer_enabled(int flag)
|
||||||
cw_keyer_enabled = (flag == 0 ? 0 : 1);
|
cw_keyer_enabled = (flag == 0 ? 0 : 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* KC4UPR: Set the keyer "hangtime". This is the delay that the T/R
|
||||||
|
* switch remains set after the last symbol was transmitted (the default
|
||||||
|
* is 250 msec, if this is never called). Can be set from 0 to 1000
|
||||||
|
* msec.
|
||||||
|
*/
|
||||||
|
void quisk_set_gpio_keyer_hangtime(int msec)
|
||||||
|
{
|
||||||
|
#if defined(DEBUG)
|
||||||
|
fprintf(stdout, "[GPIO Keyer] hangtime: %d msec\n", msec)
|
||||||
|
#endif
|
||||||
|
if ((msec > -1) && (msec < 1001)) {
|
||||||
|
cw_hangtime_msec = msec;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* EOF
|
* EOF
|
||||||
**********************************************************************/
|
**********************************************************************/
|
||||||
|
|
16
quisk.c
16
quisk.c
|
@ -5215,7 +5215,6 @@ static PyObject * set_gpio_keyer_mode(PyObject * self, PyObject * args)
|
||||||
static PyObject * set_gpio_keyer_speed(PyObject * self, PyObject * args)
|
static PyObject * set_gpio_keyer_speed(PyObject * self, PyObject * args)
|
||||||
{
|
{
|
||||||
int wpm;
|
int wpm;
|
||||||
fprintf(stderr, "Trying to set keyer speed\n");
|
|
||||||
if (!PyArg_ParseTuple (args, "i", &wpm))
|
if (!PyArg_ParseTuple (args, "i", &wpm))
|
||||||
return NULL;
|
return NULL;
|
||||||
quisk_set_gpio_keyer_speed(wpm);
|
quisk_set_gpio_keyer_speed(wpm);
|
||||||
|
@ -5280,6 +5279,20 @@ static PyObject * set_gpio_keyer_enabled(PyObject * self, PyObject * args)
|
||||||
Py_INCREF (Py_None);
|
Py_INCREF (Py_None);
|
||||||
return Py_None;
|
return Py_None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* KC4UPR: Set the GPIO keyer hangtime: the number of milliseconds to
|
||||||
|
* leave the T/R switch in "transmit" after the last CW symbol.
|
||||||
|
*/
|
||||||
|
static PyObject * set_gpio_keyer_hangtime(PyObject * self, PyObject * args)
|
||||||
|
{
|
||||||
|
int hangtime;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple (args, "i", &hangtime))
|
||||||
|
return NULL;
|
||||||
|
quisk_set_gpio_keyer_hangtime(hangtime);
|
||||||
|
Py_INCREF (Py_None);
|
||||||
|
return Py_None;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static PyMethodDef QuiskMethods[] = {
|
static PyMethodDef QuiskMethods[] = {
|
||||||
|
@ -5394,6 +5407,7 @@ static PyMethodDef QuiskMethods[] = {
|
||||||
{"set_gpio_keyer_reversed", set_gpio_keyer_reversed, METH_VARARGS, "Enabled/disable reversed paddles."},
|
{"set_gpio_keyer_reversed", set_gpio_keyer_reversed, METH_VARARGS, "Enabled/disable reversed paddles."},
|
||||||
{"set_gpio_keyer_strict", set_gpio_keyer_strict, METH_VARARGS, "Enable/disable strict character spacing."},
|
{"set_gpio_keyer_strict", set_gpio_keyer_strict, METH_VARARGS, "Enable/disable strict character spacing."},
|
||||||
{"set_gpio_keyer_enabled", set_gpio_keyer_enabled, METH_VARARGS, "Enable/disable the CW keyer"},
|
{"set_gpio_keyer_enabled", set_gpio_keyer_enabled, METH_VARARGS, "Enable/disable the CW keyer"},
|
||||||
|
{"set_gpio_keyer_hangtime", set_gpio_keyer_hangtime, METH_VARARGS, "Set number of msecs for semi-QSK delay"},
|
||||||
#endif
|
#endif
|
||||||
{NULL, NULL, 0, NULL} /* Sentinel */
|
{NULL, NULL, 0, NULL} /* Sentinel */
|
||||||
};
|
};
|
||||||
|
|
7
quisk.h
7
quisk.h
|
@ -290,6 +290,7 @@ int QuiskDeltaMsec(int);
|
||||||
* reverse - reverse left/right paddles (dot/dash by default)
|
* reverse - reverse left/right paddles (dot/dash by default)
|
||||||
* strict - enforce strict character spacing
|
* strict - enforce strict character spacing
|
||||||
* enabled - enable/disable the keyer
|
* enabled - enable/disable the keyer
|
||||||
|
* hangtime - msecs to transmit after last CW symbol
|
||||||
*/
|
*/
|
||||||
void quisk_set_gpio_keyer_mode(int);
|
void quisk_set_gpio_keyer_mode(int);
|
||||||
void quisk_set_gpio_keyer_speed(int);
|
void quisk_set_gpio_keyer_speed(int);
|
||||||
|
@ -297,6 +298,7 @@ void quisk_set_gpio_keyer_weight(int);
|
||||||
void quisk_set_gpio_keyer_reversed(int);
|
void quisk_set_gpio_keyer_reversed(int);
|
||||||
void quisk_set_gpio_keyer_strict(int);
|
void quisk_set_gpio_keyer_strict(int);
|
||||||
void quisk_set_gpio_keyer_enabled(int);
|
void quisk_set_gpio_keyer_enabled(int);
|
||||||
|
void quisk_set_gpio_keyer_hangtime(int);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Functions supporting digital voice codecs
|
// Functions supporting digital voice codecs
|
||||||
|
@ -362,6 +364,7 @@ int import_quisk_api(void); // used to initialize Quisk_API
|
||||||
//#define quisk_set_gpio_keyer_reversed (*( void (*) (int) )Quisk_API[14])
|
//#define quisk_set_gpio_keyer_reversed (*( void (*) (int) )Quisk_API[14])
|
||||||
//#define quisk_set_gpio_keyer_strict (*( void (*) (int) )Quisk_API[15])
|
//#define quisk_set_gpio_keyer_strict (*( void (*) (int) )Quisk_API[15])
|
||||||
//#define quisk_set_gpio_keyer_enabled (*( void (*) (int) )Quisk_API[16])
|
//#define quisk_set_gpio_keyer_enabled (*( void (*) (int) )Quisk_API[16])
|
||||||
|
//#define quisk_set_gpio_keyer_hangtime (*( void (*) (int) )Quisk_API[17])
|
||||||
//#endif
|
//#endif
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
@ -389,6 +392,7 @@ void quisk_sample_source4(ty_sample_start, ty_sample_stop, ty_sample_read, ty_sa
|
||||||
//void quisk_set_gpio_keyer_reversed(int);
|
//void quisk_set_gpio_keyer_reversed(int);
|
||||||
//void quisk_set_gpio_keyer_strict(int);
|
//void quisk_set_gpio_keyer_strict(int);
|
||||||
//void quisk_set_gpio_keyer_enabled(int);
|
//void quisk_set_gpio_keyer_enabled(int);
|
||||||
|
//void quisk_set_gpio_keyer_hangtime(int);
|
||||||
//#endif
|
//#endif
|
||||||
|
|
||||||
//#if defined(ENABLE_GPIO_KEYER)
|
//#if defined(ENABLE_GPIO_KEYER)
|
||||||
|
@ -401,7 +405,8 @@ void quisk_sample_source4(ty_sample_start, ty_sample_stop, ty_sample_read, ty_sa
|
||||||
// &quisk_sound_state, &QuiskGetConfigInt, &QuiskGetConfigDouble, &QuiskGetConfigString, &QuiskTimeSec, \
|
// &quisk_sound_state, &QuiskGetConfigInt, &QuiskGetConfigDouble, &QuiskGetConfigString, &QuiskTimeSec, \
|
||||||
// &QuiskSleepMicrosec, &QuiskPrintTime, &quisk_sample_source, &quisk_dvoice_freedv, &quisk_is_key_down, \
|
// &QuiskSleepMicrosec, &QuiskPrintTime, &quisk_sample_source, &quisk_dvoice_freedv, &quisk_is_key_down, \
|
||||||
// &quisk_sample_source4, &quisk_set_gpio_keyer_mode, &quisk_set_gpio_keyer_speed, \
|
// &quisk_sample_source4, &quisk_set_gpio_keyer_mode, &quisk_set_gpio_keyer_speed, \
|
||||||
// &quisk_set_gpio_keyer_weight, &quisk_set_gpio_keyer_reversed, &quisk_set_gpio_keyer_strict, &quisk_set_gpio_keyer_enabled \
|
// &quisk_set_gpio_keyer_weight, &quisk_set_gpio_keyer_reversed, &quisk_set_gpio_keyer_strict, \
|
||||||
|
// &quisk_set_gpio_keyer_enabled, &quisk_set_gpio_keyer_hangtime \
|
||||||
// }
|
// }
|
||||||
//#else
|
//#else
|
||||||
#define QUISK_API_INIT { \
|
#define QUISK_API_INIT { \
|
||||||
|
|
Loading…
Reference in New Issue