tsproc: Clarify the internal mode handling.
The time stamp processor features four modes resulting from the combination of two independent Boolean options. Even though we have a proper enumerated type to represent the mode, still the code coverts the mode into two variables. The tests on the variables are currently simple enough, but soon we will want to add some more complexity. In the interest of clarity, this patch converts the paired Boolean tests into a switch/case pattern. No functional change. Signed-off-by: Richard Cochran <richardcochran@gmail.com>master
parent
74ab3b3728
commit
a0cbeb7367
64
tsproc.c
64
tsproc.c
|
@ -26,8 +26,7 @@
|
||||||
|
|
||||||
struct tsproc {
|
struct tsproc {
|
||||||
/* Processing options */
|
/* Processing options */
|
||||||
int raw_mode;
|
enum tsproc_mode mode;
|
||||||
int weighting;
|
|
||||||
|
|
||||||
/* Current ratio between remote and local clock frequency */
|
/* Current ratio between remote and local clock frequency */
|
||||||
double clock_rate_ratio;
|
double clock_rate_ratio;
|
||||||
|
@ -48,6 +47,19 @@ struct tsproc {
|
||||||
struct filter *delay_filter;
|
struct filter *delay_filter;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int weighting(struct tsproc *tsp)
|
||||||
|
{
|
||||||
|
switch (tsp->mode) {
|
||||||
|
case TSPROC_FILTER:
|
||||||
|
case TSPROC_RAW:
|
||||||
|
return 0;
|
||||||
|
case TSPROC_FILTER_WEIGHT:
|
||||||
|
case TSPROC_RAW_WEIGHT:
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
struct tsproc *tsproc_create(enum tsproc_mode mode,
|
struct tsproc *tsproc_create(enum tsproc_mode mode,
|
||||||
enum filter_type delay_filter, int filter_length)
|
enum filter_type delay_filter, int filter_length)
|
||||||
{
|
{
|
||||||
|
@ -59,20 +71,10 @@ struct tsproc *tsproc_create(enum tsproc_mode mode,
|
||||||
|
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case TSPROC_FILTER:
|
case TSPROC_FILTER:
|
||||||
tsp->raw_mode = 0;
|
|
||||||
tsp->weighting = 0;
|
|
||||||
break;
|
|
||||||
case TSPROC_RAW:
|
case TSPROC_RAW:
|
||||||
tsp->raw_mode = 1;
|
|
||||||
tsp->weighting = 0;
|
|
||||||
break;
|
|
||||||
case TSPROC_FILTER_WEIGHT:
|
case TSPROC_FILTER_WEIGHT:
|
||||||
tsp->raw_mode = 0;
|
|
||||||
tsp->weighting = 1;
|
|
||||||
break;
|
|
||||||
case TSPROC_RAW_WEIGHT:
|
case TSPROC_RAW_WEIGHT:
|
||||||
tsp->raw_mode = 1;
|
tsp->mode = mode;
|
||||||
tsp->weighting = 1;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
free(tsp);
|
free(tsp);
|
||||||
|
@ -156,24 +158,46 @@ int tsproc_update_delay(struct tsproc *tsp, tmv_t *delay)
|
||||||
pr_debug("delay filtered %10" PRId64 " raw %10" PRId64,
|
pr_debug("delay filtered %10" PRId64 " raw %10" PRId64,
|
||||||
tsp->filtered_delay, raw_delay);
|
tsp->filtered_delay, raw_delay);
|
||||||
|
|
||||||
if (delay)
|
if (!delay) {
|
||||||
*delay = tsp->raw_mode ? raw_delay : tsp->filtered_delay;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (tsp->mode) {
|
||||||
|
case TSPROC_FILTER:
|
||||||
|
case TSPROC_FILTER_WEIGHT:
|
||||||
|
*delay = tsp->filtered_delay;
|
||||||
|
break;
|
||||||
|
case TSPROC_RAW:
|
||||||
|
case TSPROC_RAW_WEIGHT:
|
||||||
|
*delay = raw_delay;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tsproc_update_offset(struct tsproc *tsp, tmv_t *offset, double *weight)
|
int tsproc_update_offset(struct tsproc *tsp, tmv_t *offset, double *weight)
|
||||||
{
|
{
|
||||||
tmv_t delay, raw_delay = 0;
|
tmv_t delay = 0, raw_delay = 0;
|
||||||
|
|
||||||
if (tmv_is_zero(tsp->t1) || tmv_is_zero(tsp->t2) ||
|
if (tmv_is_zero(tsp->t1) || tmv_is_zero(tsp->t2) ||
|
||||||
tmv_is_zero(tsp->t3))
|
tmv_is_zero(tsp->t3))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (tsp->raw_mode || tsp->weighting)
|
switch (tsp->mode) {
|
||||||
|
case TSPROC_FILTER:
|
||||||
|
delay = tsp->filtered_delay;
|
||||||
|
break;
|
||||||
|
case TSPROC_RAW:
|
||||||
|
case TSPROC_RAW_WEIGHT:
|
||||||
raw_delay = get_raw_delay(tsp);
|
raw_delay = get_raw_delay(tsp);
|
||||||
|
delay = raw_delay;
|
||||||
delay = tsp->raw_mode ? raw_delay : tsp->filtered_delay;
|
break;
|
||||||
|
case TSPROC_FILTER_WEIGHT:
|
||||||
|
raw_delay = get_raw_delay(tsp);
|
||||||
|
delay = tsp->filtered_delay;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
/* offset = t2 - t1 - delay */
|
/* offset = t2 - t1 - delay */
|
||||||
*offset = tmv_sub(tmv_sub(tsp->t2, tsp->t1), delay);
|
*offset = tmv_sub(tmv_sub(tsp->t2, tsp->t1), delay);
|
||||||
|
@ -181,7 +205,7 @@ int tsproc_update_offset(struct tsproc *tsp, tmv_t *offset, double *weight)
|
||||||
if (!weight)
|
if (!weight)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (tsp->weighting && tsp->filtered_delay > 0 && raw_delay > 0) {
|
if (weighting(tsp) && tsp->filtered_delay > 0 && raw_delay > 0) {
|
||||||
*weight = (double)tsp->filtered_delay / raw_delay;
|
*weight = (double)tsp->filtered_delay / raw_delay;
|
||||||
if (*weight > 1.0)
|
if (*weight > 1.0)
|
||||||
*weight = 1.0;
|
*weight = 1.0;
|
||||||
|
|
Loading…
Reference in New Issue