diff options
author | Martin Burnicki <martin.burnicki@meinberg.de> | 2023-12-05 21:43:54 +0100 |
---|---|---|
committer | Martin Burnicki <martin.burnicki@meinberg.de> | 2023-12-05 21:43:54 +0100 |
commit | e81eadac71c2c60aeb9fc15aa0e3f5d93823dd46 (patch) | |
tree | 32002e835c083e41f17459e7cdf1b2b9a68a2c68 | |
parent | c66de5314faf7f59c339e4287f39259713d7041b (diff) | |
download | mbgtools-lx-e81eadac71c2c60aeb9fc15aa0e3f5d93823dd46.tar.gz mbgtools-lx-e81eadac71c2c60aeb9fc15aa0e3f5d93823dd46.zip |
mbgctrl: support setting the transmitter distance
-rw-r--r-- | mbgctrl/mbgctrl.c | 165 |
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 ) |