diff options
author | Harald Welte <laforge@gnumonks.org> | 2011-08-02 13:44:54 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2011-08-02 13:44:54 +0200 |
commit | eeb78dde9b037d6b26325e6e5b9154a91952ced9 (patch) | |
tree | e53e2f41d03af81d6b2993e4d61dd906b84e62bf /utils/osmo-arfcn.c | |
parent | 430be849945688ae107b079db1e216329b1a1f06 (diff) |
add new 'osmo-arfcn' program to compute frequency based on arfcn
The freq -> arfcn side still needs to be implemented.
Diffstat (limited to 'utils/osmo-arfcn.c')
-rw-r--r-- | utils/osmo-arfcn.c | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/utils/osmo-arfcn.c b/utils/osmo-arfcn.c new file mode 100644 index 00000000..15adbca2 --- /dev/null +++ b/utils/osmo-arfcn.c @@ -0,0 +1,103 @@ +/* Utility program for ARFCN / frequency calculations */ +/* + * (C) 2011 by Harald Welte <laforge@gnumonks.org> + * + * All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + */ + +#include <stdio.h> +#include <getopt.h> +#include <errno.h> +#include <unistd.h> +#include <stdlib.h> + +#include <osmocom/gsm/gsm_utils.h> + +enum program_mode { + MODE_NONE, + MODE_A2F, + MODE_F2A, +}; + +static int arfcn2freq(char *arfcn_str) +{ + int arfcn = atoi(arfcn_str); + uint16_t freq10u, freq10d; + + if (arfcn < 0 || arfcn > 0xffff) { + fprintf(stderr, "Invalid ARFCN %d\n", arfcn); + return -EINVAL; + } + + freq10u = gsm_arfcn2freq10(arfcn, 1); + freq10d = gsm_arfcn2freq10(arfcn, 0); + if (freq10u == 0xffff || freq10d == 0xffff) { + fprintf(stderr, "Error during conversion of ARFCN %d\n", + arfcn); + return -EINVAL; + } + + printf("ARFCN %4d: Uplink %4u.%1u MHz / Downlink %4u.%1u MHz\n", + arfcn, freq10u/10, freq10u%10, freq10d/10, freq10d%10); + + return 0; +} + +static void help(const char *progname) +{ + printf("Usage: %s [-h] [-a arfcn] [-f freq] [-u|-d]\n", + progname); +} + +int main(int argc, char **argv) +{ + int opt; + char *param; + enum program_mode mode = MODE_NONE; + + while ((opt = getopt(argc, argv, "a:f:ud")) != -1) { + switch (opt) { + case 'a': + mode = MODE_A2F; + param = optarg; + break; + case 'f': + mode = MODE_F2A; + param = optarg; + break; + case 'h': + help(argv[0]); + exit(0); + break; + default: + break; + } + } + + switch (mode) { + case MODE_NONE: + help(argv[0]); + exit(2); + break; + case MODE_A2F: + arfcn2freq(param); + break; + } + + exit(0); +} |