Add ELAPSED_INVALIDATE for caching use

Change rig_get_vfo to use ELAPSED_INVALIDATE
Change elapsed_ms code to make a little more sense
https://github.com/Hamlib/Hamlib/issues/231
pull/236/head
mdblack98 2020-05-02 11:19:44 -05:00
rodzic 54fd75ffe8
commit baa3787bc5
4 zmienionych plików z 41 dodań i 24 usunięć

Wyświetl plik

@ -1856,6 +1856,7 @@ typedef hamlib_port_t port_t;
#define ELAPSED_GET 0
#define ELAPSED_SET 1
#define ELAPSED_INVALIDATE 2
typedef enum {
CACHE_ALL, // to set all cache timeouts at once

Wyświetl plik

@ -1573,7 +1573,8 @@ int icom_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width)
signed char icmode_ext;
int ack_len = sizeof(ackbuf), retval, err;
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
rig_debug(RIG_DEBUG_VERBOSE, "%s called vfo=%s, mode=%s, width=%d\n", __func__,
rig_strvfo(vfo), rig_strrmode(mode), (int)width);
rs = &rig->state;
priv = (struct icom_priv_data *) rs->priv;
@ -1743,7 +1744,7 @@ int icom_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width)
const struct icom_priv_caps *priv_caps;
int mode_len, retval;
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
rig_debug(RIG_DEBUG_VERBOSE, "%s called vfo=%s\n", __func__, rig_strvfo(vfo));
priv_caps = (const struct icom_priv_caps *) rig->caps->priv;
retval = icom_transaction(rig, C_RD_MODE, -1, NULL, 0, modebuf, &mode_len);
@ -1801,6 +1802,8 @@ int icom_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width)
*width = retval;
}
rig_debug(RIG_DEBUG_TRACE, "%s: vfo=%s returning mode=%s, width=%d\n", __func__,
rig_strvfo(vfo), rig_strrmode(*mode), (int)*width);
return RIG_OK;
}

Wyświetl plik

@ -1254,32 +1254,41 @@ void HAMLIB_API rig_no_restore_ai()
}
//! @cond Doxygen_Suppress
int HAMLIB_API elapsed_ms(struct timespec *start, int flag_start)
int HAMLIB_API elapsed_ms(struct timespec *start, int option)
{
// If flag_start then we are starting the timing, else we get elapsed
// If option then we are starting the timing, else we get elapsed
struct timespec stop;
double elapsed_secs;
double elapsed_msec;
rig_debug(RIG_DEBUG_TRACE, "%s: start = %ld,%ld\n",__func__,(long)start->tv_sec,(long)start->tv_nsec);
if (!flag_start && start->tv_nsec == 0) return 1000000;
rig_debug(RIG_DEBUG_TRACE, "%s: start = %ld,%ld\n", __func__,
(long)start->tv_sec, (long)start->tv_nsec);
if (flag_start)
{
clock_gettime(CLOCK_REALTIME, start);
return 0;
}
else
switch (option)
{
case ELAPSED_GET:
if (start->tv_nsec == 0) { return 1000000; } // if we haven't done SET yet
clock_gettime(CLOCK_REALTIME, &stop);
break;
case ELAPSED_SET:
clock_gettime(CLOCK_REALTIME, start);
rig_debug(RIG_DEBUG_TRACE, "%s: after gettime, start = %ld,%ld\n", __func__,
(long)start->tv_sec, (long)start->tv_nsec);
break;
case ELAPSED_INVALIDATE: // we take care of this below
break;
}
elapsed_secs = (stop.tv_sec - start->tv_sec) * 1e6 + (stop.tv_nsec -
start->tv_nsec) / 1e3;
elapsed_msec = ((stop.tv_sec - start->tv_sec) + ((stop.tv_nsec -
start->tv_nsec) / 1e6)) / 1e3;
rig_debug(RIG_DEBUG_TRACE, "%s: elapse_secs=%g\n",__func__,elapsed_secs);
if (elapsed_secs < 0) return 1000000;
rig_debug(RIG_DEBUG_TRACE, "%s: elapse_secs=%g\n", __func__, elapsed_msec);
return elapsed_secs / 1000;
if (elapsed_msec < 0 || option == ELAPSED_INVALIDATE) { return 1000000; }
return elapsed_msec;
}
int HAMLIB_API rig_get_cache_timeout_ms(RIG *rig, cache_t selection)
@ -1290,7 +1299,8 @@ int HAMLIB_API rig_get_cache_timeout_ms(RIG *rig, cache_t selection)
int HAMLIB_API rig_set_cache_timeout_ms(RIG *rig, cache_t selection, int ms)
{
rig_debug(RIG_DEBUG_TRACE, "%s: called selection=%d, ms=%d\n", __func__, selection, ms);
rig_debug(RIG_DEBUG_TRACE, "%s: called selection=%d, ms=%d\n", __func__,
selection, ms);
rig->state.cache.timeout_ms = ms;
return RIG_OK;
}

Wyświetl plik

@ -1338,7 +1338,8 @@ int HAMLIB_API rig_get_freq(RIG *rig, vfo_t vfo, freq_t *freq)
if (cache_ms < rig->state.cache.timeout_ms && rig->state.cache.vfo_freq == vfo)
{
rig_debug(RIG_DEBUG_TRACE, "%s: %s cache hit age=%dms\n", __func__, rig_strvfo(vfo), cache_ms);
rig_debug(RIG_DEBUG_TRACE, "%s: %s cache hit age=%dms\n", __func__,
rig_strvfo(vfo), cache_ms);
*freq = rig->state.cache.freq;
return RIG_OK;
}
@ -1409,7 +1410,8 @@ int HAMLIB_API rig_get_freq(RIG *rig, vfo_t vfo, freq_t *freq)
cache_ms = elapsed_ms(&(rig->state.cache.time_freq), ELAPSED_SET);
rig_debug(RIG_DEBUG_TRACE, "%s: cache reset age=%dm, vfo=%s, freq=%g\n", __func__, cache_ms, rig_strvfo(vfo), *freq);
rig_debug(RIG_DEBUG_TRACE, "%s: cache reset age=%dm, vfo=%s, freq=%g\n",
__func__, cache_ms, rig_strvfo(vfo), *freq);
rig->state.cache.freq = *freq;
rig->state.cache.vfo_freq = vfo;
@ -1814,10 +1816,11 @@ int HAMLIB_API rig_set_vfo(RIG *rig, vfo_t vfo)
rig->state.cache.vfo = vfo;
// expire several cached items when we switch VFOs
elapsed_ms(&rig->state.cache.time_vfo, ELAPSED_SET);
elapsed_ms(&rig->state.cache.time_freq, ELAPSED_SET);
elapsed_ms(&rig->state.cache.time_mode, ELAPSED_SET);
elapsed_ms(&rig->state.cache.time_vfo, ELAPSED_INVALIDATE);
elapsed_ms(&rig->state.cache.time_freq, ELAPSED_INVALIDATE);
elapsed_ms(&rig->state.cache.time_mode, ELAPSED_INVALIDATE);
rig_debug(RIG_DEBUG_TRACE, "%s: return %d, vfo=%s\n", __func__, retcode, rig_strvfo(vfo));
return retcode;
}