summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Burnicki <martin.burnicki@meinberg.de>2023-12-05 21:43:54 +0100
committerMartin Burnicki <martin.burnicki@meinberg.de>2023-12-05 21:43:54 +0100
commite81eadac71c2c60aeb9fc15aa0e3f5d93823dd46 (patch)
tree32002e835c083e41f17459e7cdf1b2b9a68a2c68
parentc66de5314faf7f59c339e4287f39259713d7041b (diff)
downloadmbgtools-lx-e81eadac71c2c60aeb9fc15aa0e3f5d93823dd46.tar.gz
mbgtools-lx-e81eadac71c2c60aeb9fc15aa0e3f5d93823dd46.zip
mbgctrl: support setting the transmitter distance
-rw-r--r--mbgctrl/mbgctrl.c165
1 files changed, 160 insertions, 5 deletions
diff --git a/mbgctrl/mbgctrl.c b/mbgctrl/mbgctrl.c
index 96f9047..270c9f8 100644
--- a/mbgctrl/mbgctrl.c
+++ b/mbgctrl/mbgctrl.c
@@ -1,7 +1,7 @@
/**************************************************************************
*
- * $Id: mbgctrl.c 1.34 2022/12/21 15:11:25 martin.burnicki REL_M $
+ * $Id: mbgctrl.c 1.35 2023/12/05 20:22:22 martin.burnicki REL_M $
*
* Description:
* Main file for mbgctrl program which sends commands and
@@ -9,6 +9,8 @@
*
* -----------------------------------------------------------------------
* $Log: mbgctrl.c $
+ * Revision 1.35 2023/12/05 20:22:22 martin.burnicki
+ * Support setting the transmitter distance.
* Revision 1.34 2022/12/21 15:11:25 martin.burnicki
* Removed obsolete (PCPS_DEV *) parameter from some functions,
* and use feature check functions instead of macros.
@@ -150,6 +152,13 @@ static const char str_spc_not[] = " not";
static const char str_spc_not_supp[] = " (not supported)";
static const char str_spc_wildcard[] = " (wildcard)";
+static const char str_ant_cab_len[]="antenna cable length";
+static const char str_tr_distance[]="distance from transmitter";
+
+static const char str_truncated[] = "truncated";
+static const char str_not_accepted[] = "not accepted";
+
+
static TZDL tzdl_utc = DEFAULT_TZDL_UTC;
static TZDL tzdl_cet_cest = DEFAULT_TZDL_CET_CEST_EN;
static TZDL tzdl_eet_eest = DEFAULT_TZDL_EET_EEST_EN;
@@ -182,6 +191,7 @@ static const char no_time_scale[] = "does not support a configurable time scale"
static const char no_lan_intf[] = "has no LAN interface";
static const char no_ptp[] = "does not provide PTP";
static const char no_cab_len[] = "does not support antenna signal delay compensation";
+static const char no_tr_distance[] = "does not support compensation of the transmitter distance";
@@ -522,6 +532,56 @@ void print_bit_mask_list( const char *info_1, const char *info_2, uint32_t supp_
static /*HDR*/
+long check_range( long l, long min_limit, long max_limit )
+{
+ if ( l < min_limit )
+ return min_limit;
+
+ if ( l > max_limit )
+ return max_limit;
+
+ return l;
+
+} // check_range
+
+
+
+static /*HDR*/
+int mbg_check_rc_acc_trunc( int rc, const char *info,
+ bool force_truncated )
+{
+ const char *cp = NULL;
+
+ switch ( rc )
+ {
+ case MBG_ERR_CFG_TRUNC:
+ cp = str_truncated;
+ break;
+
+ case MBG_ERR_CFG:
+ cp = str_not_accepted;
+ break;
+
+ default:
+ if ( mbg_rc_is_success( rc ) && force_truncated )
+ {
+ cp = str_truncated;
+ break;
+ }
+
+ return rc;
+ }
+
+ if ( cp )
+ printf( "** Warning: %s %s!\n", info, cp );
+
+ return MBG_SUCCESS;
+
+} // mbg_check_rc_acc_trunc
+
+
+
+static /*HDR*/
void err_msg( const char *msg )
{
printf( "This device %s.\n", msg );
@@ -2577,7 +2637,7 @@ int show_ant_cable_len( MBG_DEV_HANDLE dh, const char *info )
if ( mbg_cond_err_msg( rc, "mbg_get_gps_ant_cable_len" ) )
return rc;
- printf( "%s antenna cable length: %u meter(s)", info, len );
+ printf( "%s %s: %u meter(s)", info, str_ant_cab_len, len );
return MBG_SUCCESS;
@@ -2588,10 +2648,21 @@ int show_ant_cable_len( MBG_DEV_HANDLE dh, const char *info )
static /*HDR*/
int set_ant_cable_len( MBG_DEV_HANDLE dh, const char *s )
{
- ANT_CABLE_LEN len = (ANT_CABLE_LEN) atol( s ); // TODO check range ?
- int rc = mbg_set_gps_ant_cable_len( dh, &len );
+ long l_raw = atol( s );
+ long l_checked = check_range( l_raw, 0, (ANT_CABLE_LEN) -1 );
+ ANT_CABLE_LEN new_len = (ANT_CABLE_LEN) l_checked;
+ ANT_CABLE_LEN org_len;
+
+ int rc = mbg_get_gps_ant_cable_len( dh, &org_len );
+
+ if ( mbg_cond_err_msg( rc, "mbg_get_gps_ant_cable_len" ) )
+ return rc;
- if ( mbg_cond_err_msg( rc, "mbg_set_gps_ant_cable_len" ) )
+ rc = mbg_set_and_check_gps_ant_cable_len( dh, &new_len, &org_len );
+
+ rc = mbg_check_rc_acc_trunc( rc, str_ant_cab_len, l_checked != l_raw );
+
+ if ( mbg_cond_err_msg( rc, "mbg_set_and_check_gps_ant_cable_len" ) )
return rc;
return MBG_SUCCESS;
@@ -2601,6 +2672,49 @@ int set_ant_cable_len( MBG_DEV_HANDLE dh, const char *s )
static /*HDR*/
+int show_tr_distance( MBG_DEV_HANDLE dh, const char *info )
+{
+ TR_DISTANCE dist;
+ int rc = mbg_get_tr_distance( dh, &dist );
+
+ if ( mbg_cond_err_msg( rc, "mbg_get_tr_distance" ) )
+ return rc;
+
+ printf( "%s %s: %u km", info, str_tr_distance, dist );
+
+ return MBG_SUCCESS;
+
+} // show_tr_distance
+
+
+
+static /*HDR*/
+int set_tr_distance( MBG_DEV_HANDLE dh, const char *s )
+{
+ long l_raw = atol( s );
+ long l_checked = check_range( l_raw, 0, (TR_DISTANCE) -1 );
+ TR_DISTANCE new_dist = (TR_DISTANCE) l_checked;
+ TR_DISTANCE org_dist;
+
+ int rc = mbg_get_tr_distance( dh, &org_dist );
+
+ if ( mbg_cond_err_msg( rc, "mbg_get_tr_distance" ) )
+ return rc;
+
+ rc = mbg_set_and_check_tr_distance( dh, &new_dist, &org_dist );
+
+ rc = mbg_check_rc_acc_trunc( rc, str_tr_distance, l_checked != l_raw );
+
+ if ( mbg_cond_err_msg( rc, "mbg_get_and_check_tr_distance" ) )
+ return rc;
+
+ return MBG_SUCCESS;
+
+} // set_tr_distance
+
+
+
+static /*HDR*/
int set_event_time( MBG_DEV_HANDLE dh, const char *s )
{
char ws[80];
@@ -2904,6 +3018,14 @@ void usage( MBG_DEV_HANDLE dh, RECEIVER_INFO *p_ri,
"\n"
);
+ printf( " TR_DISTANCE Show the configured transmitter distance.\n"
+ " TR_DISTANCE=<dist> Set the transmitter distance to be compensated to <dist>, in kilometers.\n"
+ "\n"
+ " Please note that this parameter can only be used with devices that support compensation\n"
+ " of the transmitter distance, e.g. with DCF77 PZF receivers.\n"
+ "\n"
+ );
+
if ( dh != MBG_INVALID_DEV_HANDLE )
{
if ( mbg_rc_is_success( mbg_chk_dev_has_event_time( dh ) ) )
@@ -3396,6 +3518,39 @@ int check_cmd_line( int argc, char *argv[], MBG_DEV_HANDLE dh,
}
+ cp = str_parm_p( argv[i], "TR_DISTANCE" );
+
+ if ( cp )
+ {
+ if ( dh != MBG_INVALID_DEV_HANDLE )
+ {
+ char *info = "Current";
+
+ if ( mbg_rc_is_error( mbg_chk_dev_has_tr_distance( dh ) ) )
+ {
+ err_msg( no_tr_distance );
+ continue;
+ }
+
+ if ( *cp == '=' )
+ {
+ rc = set_tr_distance( dh, ++cp );
+
+ if ( mbg_rc_is_error( rc ) )
+ {
+ must_print_usage = true;
+ continue;
+ }
+
+ info = "New";
+ }
+
+ show_tr_distance( dh, info );
+ }
+ continue;
+ }
+
+
cp = str_parm_p( argv[i], "EVENT" );
if ( cp )